日期:2014-05-18  浏览次数:20929 次

C#调用C++编写的DLL提示无法在 DLL“Handwriting.dll”中找到名为“Compare”的入口点
DLL文件中函数为
extern "C" __declspec(dllexport)
extern void __stdcall Compare(CharType * cChar,short int cReturn[10])
C#
[DllImport("Handwriting.dll", EntryPoint = "Compare", SetLastError = true)]
  private static extern void Compare(CharacterType cChar, int cReturn);
然后调用
Compare(c,r[0]);
为何一直提示无法在 DLL“Handwriting.dll”中找到名为“Compare”的入口点

------解决方案--------------------
探讨
引用:
引用:
你那c++的动态库有没有和你的c#程序在一个目录?

在啊
是不是第一个参数写错了,DLL中第一个参数是结构体指针型的,C#中调用时就直接是结构体类型的,要是这样的话,C#中怎样表示一个指向结构体型的指针啊,第一个参数该怎么写。我觉得最大的可能就是参数写错了,但就是不知道该怎么写

------解决方案--------------------
呵呵 好怀念啊 当年纠结这个问题也纠结了好久
应该是结构体的对齐引起的
在C#的结构体CharacterType的定义前加入[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
其中具体的值你可以看文档,然后根据你自己的情况调整

另外,由于你的函数中传递是是结构体指针,所以在C#中 结构体前需要加ref关键字
 private static extern void Compare(ref CharacterType cChar, int cReturn);

还不行再问我,这个我还算是有点经验了,不过隔的太久,也有点忘了