.h :
#pragma once
class __declspec(dllexport) MyExport
{
public:
MyExport();
void print();
int getA() const;
private:
int a = 10;
};
__declspec(dllexport) int FUNCTION();
__declspec(dllexport) int FUNCTION2();
.cpp(部分):
__declspec(dllexport) int FUNCTION()
{
MyExport aaa;
return aaa.getA();
}
.cs(调用):
[DllImport("E:\testProj\testdll\Project1\x64\Release\Project1.dll",
CallingConvention = CallingConvention.Cdecl)]//, EntryPoint = "FUNCTION"
private static extern System.Int32 FUNCTION();
private void Button_Click(object sender, RoutedEventArgs e)
{
var aaa = FUNCTION();
MessageBox.Show(aaa.ToString());
}
结果报异常:
System.EntryPointNotFoundException:“Unable to find an entry point named 'FUNCTION' in DLL 'E:testProjtestdllProject1x64ReleaseProject1.dll'.”(无法找到入口点)
于是用dependency walker查看:
函数名并不是“FUNCTION”, 因为C++编译器会对函数进行处理
于是尝试了一下 把代码改成:
__declspec(dllexport) int FUNCTION(); #pragma comment(linker, "/export:FUNCTION=?FUNCTION@@YAHXZ") __declspec(dllexport) int FUNCTION2();
重新编译以后 可以正常调用,但是这种方法肯定不行,总不能在编译完之后再回来改代码吧。
后来改用以C方式编译,即加入了extern "C":
extern "C" {
__declspec(dllexport) int FUNCTION();
__declspec(dllexport) int FUNCTION2();
}
重新编译:
函数名保持不变,C#端可以成功调用。
另一种方法就是使用.def文件列出导出函数,暂不细讲了。
如有错误和更好的方法,请不吝指正。



