桥接非托管类和托管类

Posted

技术标签:

【中文标题】桥接非托管类和托管类【英文标题】:Bridging unmanaged and managed classes 【发布时间】:2013-01-13 13:42:35 【问题描述】:

我有一个导出到 Win32 Dll 的本机 C++ 类:

class __declspec(dllexport) Manager  ... 

Dll 创建成功。我们就叫它Unmanaged.dll吧。

我想在 .Net 应用程序中使用这个类。因此,我决定创建托管 C++ 包装类。所以我创建了一个新的 CLR 类库,在其中将 Unmanaged.dll 设置为链接器的输入。

编译托管 dll 时出现以下错误:

致命错误 LNK1107:文件无效或损坏:无法在 0x318 处读取。 (项目ManagedBridge中的Unmanaged.dll)

两个项目都设置为编译为 x64。 DLL 导出查看器显示类的构造函数和方法。所以 Dll 似乎没问题。

我有什么遗漏吗?

【问题讨论】:

【参考方案1】:

您不能将 DLL 传递给链接器,它不知道如何处理它。 DLL 通常不适合帮助链接器确定 DLL 是否包含您调用的函数。从 DLL 导出可以是多个名称。它是一个数字(“序数”)是一个问题,链接器将不知道如何将数字映射到标识符名称。并且名称也不必匹配,名称通常会被简化并去除名称装饰。

您必须将 DLL 的导入库告诉链接器。其中包含更多信息,包括名称映射的序数和编译器使用的原始修饰名称。导入库是链接 DLL 时创建的 .lib。您将在 DLL 项目的构建目录中找到它。将其路径添加到链接器的 Additional Dependencies 设置中。

【讨论】:

以上是关于桥接非托管类和托管类的主要内容,如果未能解决你的问题,请参考以下文章

将托管类中包含的非托管指针字段传递给非托管代码

在托管代码和非托管代码之间传递非托管结构的安全数组

在托管代码中填充非托管数组

托管库和非托管库之间有啥区别?

托管 C# 代码未发生非托管调用

如何识别项目是托管 c++ 项目还是非托管 c++ 项目