【发布时间】:2016-06-17 21:58:17
【问题描述】:
我正在使用 C# 编写一个 DLL,该 DLL 将从 Delphi Windows 应用程序访问,并且遇到了重新导出类/方法的问题。无论我尝试什么,似乎都没有被导出。
我使用 Hans Passant 在 this question re UnmangedExports 中提供的记录方法创建了一个测试 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 答案的方式)。
提前感谢您的帮助!
在所有 cmets 之后(谢谢!)我已经确认它是一个动态库项目,并且我已经在 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 中?
【问题讨论】:
-
您肯定在错误的 DLL 上运行 Dumpbin.exe,因为它位于 ExportTestCS 目录中。您必须在 C++ 项目生成的 DLL 上运行它。您还必须确保您的测试项目可以找到两个 DLL。
-
远射 - 您是否在 AssemblyInfo 中从 [assembly: ComVisible(false)] 设置了 [assembly: ComVisible(true)]?
-
我在项目文件夹中搜索了所有 .dll 文件,但它们只存在于 C# 项目中?我会试试 AssemblyInfo 设置,看看是否有什么不同。
-
OK - 我找到了 AssemblyInfo 设置(我是 C++ 的新手!)并将 ComVisible 更改为 true(它是 false) - 但它没有任何区别。我想知道是否是其他一些配置设置阻止了 C++ 项目生成 DLL?
-
@Hans @Murray 不确定这是否有帮助 - 这是来自 C++ 构建的 ExportTest.log 的内容:
Stdafx.cpp AssemblyInfo.cpp ExportTest.cpp Generating Code... .NETFramework,Version=v4.5.2.AssemblyAttributes.cpp Creating library C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.lib and object C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.exp ExportTest.vcxproj -> C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll ExportTest.vcxproj -> C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.pdb (Full PDB)