我无法让这个工作。我创建了一个带有c ++ DLL Project,c ++ ConsoleApplication和c#ConsoleApplication的测试解决方案(VS2015)。 Console Application都在其main方法中调用DLL函数并将结果打印到控制台。所有项目都构建到同一目录。
这在c ++ ConsoleApplication中工作正常,因为我只是添加了对DLL-Project的引用并包含了头文件。
在c#ConsoleApplication中,我无法使用它。我知道它的非托管代码,我需要使用DLLImport。
当我尝试运行c#app时,它会在调用test()时引发System.EntryPointNotFoundException。并说无法找到入口点“测试”。
那么我做错了什么?
Programm.cs
using System;
using System.Runtime.InteropServices;
namespace DLLTestCSharp
{
class Program
{
[DllImport("DLL.dll")]
public static extern int test();
static void Main(string[] args)
{
Console.WriteLine(test());
Console.Read();
}
}
}
编译为DLL.dll。
{{1}}
编译为DLLTestCSharp.exe。
答案 0 :(得分:1)
我认为你的问题是,当我们在c / c ++和导出函数中编译代码时,根据我们使用的调用约定,在导出表中有@ Test0等名称。我说你下载CffExplorer并查看你的dll导出表。然后尝试使用正确的名称导入。
答案 1 :(得分:1)
由于C ++名称而无法找到入口点'截断。它以特殊的独特方式对方法名称进行编码,以支持重载和模板。
要禁用此行为并按原样导出方法名称,您需要使用extern "C"
标记方法(或放入extern "C" { }
块),或者将带有导出名称的.def文件添加到您的dll项目。
通常在头文件中完成:
#ifdef __cplusplus
extern "C" {
#endif
DLL_API int test();
// other functions
#ifdef __cplusplus
}
#endif
这适用于所有平台。
另一方面,Def文件主要是Windows方法。您将 ProjectName .def添加到您的解决方案并将其放在导出列表中:
LIBRARY <libraryname>
EXPORTS
test
更多关于MSDN