我建议您按照文档的方式进行操作,而不要依赖于作者不提供支持的未经文档记录的 hack。我们可以通过以下示例来实现此操作:
namespace Publics {
public class Class1 {
public static void Run() {
}
}
}
将一个新的C++/CLI类库添加到您的项目中。右键单击解决方案,选择“添加”,然后选择“新建项目”。打开“其他语言”节点,选择Visual C++、CLR,然后选择“类库”项目模板。右键单击新项目,选择“属性”,选择“常规属性”,再选择“框架和引用”,点击“添加新引用”按钮。在“项目”选项卡中,选择要导出方法的C#项目。
删除预生成的带有//TODO注释的空类,并编写以下代码:
extern "C" __declspec(dllexport)
void __stdcall Example()
{
Publics::Class1::Run();
}
构建您的解决方案。运行dumpbin.exe /exports命令对DLL进行导出检查,以确保Example函数已经导出。您应该会看到类似于以下内容:
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编译器相同的技术导出托管方法。