DLImport c#console应用程序导入c ++ DLL

时间:2016-02-03 19:12:55

标签: c# c++ visual-studio dll dllimport

我无法让这个工作。我创建了一个带有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。

https://gist.github.com/DevOpsCow/d374300304d7beef8a03

2 个答案:

答案 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