我正在使用C#编写DLL,这将从Delphi Windows应用程序访问,并且已经解决了导出类/方法的问题。无论我尝试什么,似乎都没有出口。
我使用Hans Passant在this question unmangedExports中{{3}}提供的文档化方法创建了一个测试DLL。
我使用以下代码创建了一个C#类库项目:
namespace ExportTestCS
{
public class ExpTest
{
public static void Test()
{
Console.WriteLine("Hi!");
}
}
}
和C ++'包装'做出口:
extern "C" __declspec(dllexport)
void __stdcall Test()
{
ExportTestCS::ExpTest::Test();
}
C ++项目引用了C#项目并且所有构建都正常,但是当我在DLL上运行dumpbin / exports时,没有任何导出:
dumpbin /exports C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll
Dump of file C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll
File Type: DLL
Summary
2000 .reloc
2000 .rsrc
2000 .text
C:\Program Files (x86)\Microsoft Visual Studio 14.0>
我已经针对调试和发布的构建产生的所有dll运行dumpbin,它们都给出了相同的结果。
因此,我的问题是 - 我做错了什么?我花了很长时间来搜索类似的问题,但它们似乎都是使用C ++包装器或UnmangedExports解决的。
这两个项目都在为x86 / win32构建,并且具有相同的目标框架(4.5.2)。我尝试过静态类的各种组合,没有类,__ clrcall / __ stdcall等,但无济于事。
我之前也尝试过UnmanagedExports NuGet包,但没有成功(这就是我找到Hans'的答案)。
提前感谢您的帮助!
完成所有评论后(谢谢!)我已经确认它是一个动态库项目,我在C ++项目中创建了一个新文件夹,并将其设置为输出文件夹。构建现在将.lib,.exp,.pdb,.dll和.dll.metagen文件放入该文件夹,这是构建时输出选项卡中报告的文件夹。但仍然没有快乐,dumpbin的输出与以往一样!
当我对新输出文件夹中的.lib文件运行dumpbin时,我得到了这个:
Dump of file C:\Temp\ExportTest\ExportTestCPP\ExportTest\Output\exporttest.lib
File Type: LIBRARY
Exports
ordinal name
_Test@0
Summary
CC .debug$S
14 .idata$2
14 .idata$3
4 .idata$4
4 .idata$5
10 .idata$6
C:\Program Files (x86)\Microsoft Visual Studio 14.0>
所以看起来.lib正在导出Test方法,但它不在最终的DLL中?
答案 0 :(得分:1)
我刚尝试了你的例子,当我在C ++ dll上运行dumpbin时,它对我有用,但是当我对C#dll运行时,它给你的结果与你的相同。
Dump of file C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll
那是你的C#程序集吗?
答案 1 :(得分:0)
问题一定是我设置项目的方式。我从头开始了,一切正常。
当我设置原始ExportTest项目时,我无意中为C#项目创建了一个Windows Universal类库,虽然我意识到并将其更改为标准的Windows类库项目(删除了原始文件并创建了一个新项目)我相信它必须在解决方案配置中留下一些阻止DLL导出的东西。
非常感谢所有回答/评论的人!