#include "FmEntControllerI.h"
#include "FmExtControllerI.h"
#include "Draft.h"
using namespace SCC;
namespace FM
{
class PassCalc
{
public:
PassOutput* precalc2(PassInput* indata);
}
}
在C#中引用代码如下:
[DllImport("LIU.dll", EntryPoint = "precalc2", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr precalc2(IntPtr indata);
然后调试的时候就显示找不到“precalc2”入口点,各位大神,帮帮我啊,这是什么原因哦?
10 个解决方案
#1
要作为入口点,的方法, 需要在最外层,不能属于某个类,而且如果要公开给其他程序调用,也是有一定要求的,示例如下.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.
#2
谢谢你的回答,我加了这句__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);后,DLL文件编译出现了很多错误,还有你说的“传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中”这个方法能详细说一下么,或者能不能给个实例,我是新手,谢谢你了、、、
#4
C中的函数不Export,外面没法用的。
#5
看着像是托管C, 在C#中添加引就用好了. class FM前面也得加个public,否则在C#中看不到FM,更别说里面的函数了
#6
成员函数不是这么导出的,而且参数也不正确,第一个参数为 this, 而且 CallConversion 也不是 __cdecl 的。
#7
#ifdef CFORCS_EXPORTS
#define CFORCS_API _declspec(dllexport)
#else
#define CFORCS_API __declspec(dllimport)
#endif
class CFORCS_API CCForCS
: public CCForCSBase
{
public:
CCForCS(void);
CCForCS(int nValue);
virtual ~CCForCS(void);
private:
//CCForCS &operator=(CCForCS const &) = delete;
public:
void Print(LPCWSTR pszMessage);
C# 以Print 为例:
[DllImport(dllname, EntryPoint = "?Print@CCForCS@@QAEXPB_W@Z", CallingConvention = CallingConvention.ThisCall)]
private static extern void _Print([In] IntPtr @this, [In, MarshalAs(UnmanagedType.LPWStr)]string message);
public void Print(string message)
{
_Print(_basecpp, message);
}
#8
你写这个dll主要是为C#使用的话根本没有必要在放到类中。直接写成函数供C#调用好了。
__declspec(dllexport) extern "C" 放到函数前。
__declspec(dllexport) extern "C" 放到函数前。
#9
为什么提示我System.Runtime.InteropServices中不存在DllImport
#10
谢谢!
#1
要作为入口点,的方法, 需要在最外层,不能属于某个类,而且如果要公开给其他程序调用,也是有一定要求的,示例如下.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.
#2
谢谢你的回答,我加了这句__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);后,DLL文件编译出现了很多错误,还有你说的“传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中”这个方法能详细说一下么,或者能不能给个实例,我是新手,谢谢你了、、、
#3
#4
C中的函数不Export,外面没法用的。
#5
看着像是托管C, 在C#中添加引就用好了. class FM前面也得加个public,否则在C#中看不到FM,更别说里面的函数了
#6
成员函数不是这么导出的,而且参数也不正确,第一个参数为 this, 而且 CallConversion 也不是 __cdecl 的。
#7
#ifdef CFORCS_EXPORTS
#define CFORCS_API _declspec(dllexport)
#else
#define CFORCS_API __declspec(dllimport)
#endif
class CFORCS_API CCForCS
: public CCForCSBase
{
public:
CCForCS(void);
CCForCS(int nValue);
virtual ~CCForCS(void);
private:
//CCForCS &operator=(CCForCS const &) = delete;
public:
void Print(LPCWSTR pszMessage);
C# 以Print 为例:
[DllImport(dllname, EntryPoint = "?Print@CCForCS@@QAEXPB_W@Z", CallingConvention = CallingConvention.ThisCall)]
private static extern void _Print([In] IntPtr @this, [In, MarshalAs(UnmanagedType.LPWStr)]string message);
public void Print(string message)
{
_Print(_basecpp, message);
}
#8
你写这个dll主要是为C#使用的话根本没有必要在放到类中。直接写成函数供C#调用好了。
__declspec(dllexport) extern "C" 放到函数前。
__declspec(dllexport) extern "C" 放到函数前。
#9
为什么提示我System.Runtime.InteropServices中不存在DllImport
#10
谢谢!