DLImport c#控制台应用程序导入c++;动态链接库
我很难让它工作。我用C++ DLL项目、C++控制台应用程序和C语言控制台应用程序创建了一个测试解决方案(VS2015)。 两个控制台应用程序都在其主方法中调用a DLL函数,并将结果打印到控制台。所有项目都生成到同一目录 <>这在C++控制台应用程序中很好,因为我只是添加了对DLL项目的引用,并包含了页眉。 在c#ConsoleApplication中,我无法实现这一点。我知道它是非托管代码,我需要使用DLLImport 当我尝试运行c#应用程序时,调用test()时会引发System.EntryPointNotFoundException。并表示无法找到入口点“测试” 那么我做错了什么DLImport c#控制台应用程序导入c++;动态链接库,c#,c++,visual-studio,dll,dllimport,C#,C++,Visual Studio,Dll,Dllimport,我很难让它工作。我用C++ DLL项目、C++控制台应用程序和C语言控制台应用程序创建了一个测试解决方案(VS2015)。 两个控制台应用程序都在其主方法中调用a DLL函数,并将结果打印到控制台。所有项目都生成到同一目录 这在C++控制台应用程序中很好,因为我只是添加了对DLL项目的引用,并包含了页眉。 在c#ConsoleApplication中,我无法实现这一点。我知道它是非托管代码,我需要使用DLLImport 当我尝试运行c#应用程序时,调用test()时会引发System.Entry
DLL.h
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API int test(void);
DLL.cpp
#include "DLL.h"
// This is an example of an exported function.
DLL_API int test(void)
{
return 42;
}
它编译为DLL.DLL
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();
}
}
}
它编译为DLLTestCSharp.exe
我认为您的问题是,当我们在c/c++中编译代码并导出函数时,根据我们使用的调用约定,导出表中有@Test0等名称。我建议您下载CffExplorer并查看dll的导出表。然后尝试用正确的名称导入.< /p> ,因为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
库
出口
测试
更多关于这是因为C++名字的模糊。你需要用<代码>外部“C++”<代码>来标记你的方法,或者添加一个带有导出名称的.DEF文件到你的DLL项目。你的意思是我必须在没有API宏API宏的情况下手动地进行导出/导入吗?可以通过在
extern“C”
块中声明函数(或将extern“C”
添加到API宏中)或在.def文件中提供导出名称来完成。非常感谢!从DLL\u API int test(void)更改DLL.h中的方法后代码>至外部“C”DLL\U API内部测试(无效)代码>它编译和执行正确!但是,难道没有一种方法可以通过c#method的正确属性来实现这一点吗?Alex Skalozub-创建一个具有相同内容的答案,我会将其标记为已解决