我一直在尝试在 Visual Studio 2010 pro/C# 项目中使用 Robert Giesecke 的扩展“Unmanaged Exports”。然而,我无法让它工作 - 当我检查已编译的 DLL 的导出时,查看器 ( http://www.nirsoft.net/utils/dll_export_viewer.html ) 总是空的,似乎根本没有定义任何导出。
我几乎复制了示例并将构建/配置管理器/事件平台设置为 x86。我能以某种方式检查执行所有魔术的 MSBuild 任务是否实际运行了吗?项目文件应该包含什么(对我来说它似乎是可疑的空?)
我建议您按照记录的方式执行此操作,而不是依赖不提供支持的作者的未记录的 hack。让我们举个例子:
namespace Publics {
public class Class1 {
public static void Run() {
// Stuff...
}
}
}
向您的项目添加一个新的 C++/CLI 类库。右键单击解决方案,添加,新建项目。打开“其他语言”节点、Visual C++、CLR,然后选择“类库”项目模板。右键单击新项目,Properties,Common Properties,Framework and References,单击 Add New Reference 按钮。从“项目”选项卡中,选择要导出其方法的 C# 项目。
删除预先生成的带有//TODO注释的空类,写出这样的代码:
extern "C" __declspec(dllexport)
void __stdcall Example()
{
Publics::Class1::Run();
}
构建您的解决方案。通过在 DLL 上运行 dumpbin.exe/exports 检查示例函数是否已导出。您应该会看到与此类似的内容:
1 0 00001020 _Example@0 = _Example@0
除了名称和调用约定之外,您现在还有很多选择来调整导出的函数。如果你想导出实例方法而不是静态方法,你可以编写这样的函数,例如:
extern "C" __declspec(dllexport)
void __stdcall Example()
{
Publics::Class1^ obj = gcnew Publics::Class1;
obj->Run();
}
等等,如果您要对此进行详细说明,则需要熟悉 C++/CLI 语言。最后但并非最不重要的一点是,您还可能会发现在最初尝试使 Giesecke 的 IL 重写器工作时出了什么问题。否则,它使用与 C++/CLI 编译器用于导出托管方法完全相同的技术。