C#调用非托管代码"找不到入口点"解决办法

原因:在C++函数声明时要将 extern "C" 添加在 DLL 函数声明之前。

[DllImport("a.dll")] 
public extern static int F(); 
调用后提示找不到入口点 


在命令行用dumpbin /exports 看函数名: ,或用exeScope查看导出的接口
dumpbin /exports a.dll 
函数名不是"F"?而是"?F@@YAHXZ" 

C#函数声明写成: 

[DllImport("a.dll",EntryPoint="?F@@YAHXZ")] 
public extern static int F(); 

这样调用成功! 


1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

      也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!
     

原文地址:https://www.cnblogs.com/panjun/p/3025652.html