c#调用c++DLL文件,找不到入口点问题

时间:2021-12-08 19:14:22
这是编译c++DLL的头文件:(PassOutput   和PassInput是定义的两个结构体)
#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表示成功,其他数字表示各种错误原因.

#2


引用 1 楼 tcmakebest 的回复:
要作为入口点,的方法, 需要在最外层,不能属于某个类,而且如果要公开给其他程序调用,也是有一定要求的,示例如下.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.


谢谢你的回答,我加了这句__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" 放到函数前。

#9


为什么提示我System.Runtime.InteropServices中不存在DllImport

#10


引用 3 楼 jmcooler 的回复:
参见: http://bbs.csdn.net/topics/390780098

谢谢!

#1


要作为入口点,的方法, 需要在最外层,不能属于某个类,而且如果要公开给其他程序调用,也是有一定要求的,示例如下.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.

#2


引用 1 楼 tcmakebest 的回复:
要作为入口点,的方法, 需要在最外层,不能属于某个类,而且如果要公开给其他程序调用,也是有一定要求的,示例如下.
__declspec(dllexport) PassOutput* __stdcall precalc2(PassInput* indata);
另外最好不要返回指针,改为传入缓冲区地址和缓冲区大小,函数中把要返回的结构体复制到那个缓冲区中,
返回值改成整数, 0表示成功,其他数字表示各种错误原因.


谢谢你的回答,我加了这句__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" 放到函数前。

#9


为什么提示我System.Runtime.InteropServices中不存在DllImport

#10


引用 3 楼 jmcooler 的回复:
参见: http://bbs.csdn.net/topics/390780098

谢谢!