c++ - 如何在 .NET 中使用托管 DLL 中的非托管类?

标签 c++ dll unmanaged dllimport

我有一个非托管类,我正在尝试从托管 DLL 文件中导出。我正在尝试在另一个托管 DLL 文件中使用非托管类。但是,当我尝试执行此操作时,出现了链接 错误。

我对非托管 DLL 文件做过很多次,所以我知道它是如何工作的。我知道如何在托管类中使用“public ref”等。

我需要在某处设置一些标志吗?还是我必须做一些 DllImport 魔术?

这是在 .NET 2.0 和 Visual Studio 2005 上.

最佳答案

如果您想从托管代码中使用非托管类,您可以:

  1. 使用一些讨厌的东西 P/Invoke加载类成员函数(构造函数、析构函数等)并制作一个更糟糕的托管包装类来调用“真实”成员函数。当涉及虚拟方法时,情况会变得更糟。
  2. 第二个选项(在我看来更好)是写一个 C++/CLI包装类(您提到过您对此很熟悉)是非托管类的简单代理。对于非托管类中的每个成员函数,您的代理类中都会有一个类似的成员函数。然后这是一个从托管项目添加对该 DLL 的引用的简单案例,您将能够像使用任何其他 .NET 类一样使用您的类。考虑到如果您的类(class)公开其他非托管内容(那些无法编码的内容),您将遇到更多工作。

如果您需要有关第二个选项的更多信息,我可以查找一些旧链接来更多地解释此技术。

关于c++ - 如何在 .NET 中使用托管 DLL 中的非托管类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674009/

相关文章:

c++ - 不分配任何 char 内存的 const 字符串构造函数?

c# - 在 C# 中读取时,如何从 C++ 中删除字符串\0

c++ - 是否可以在非托管代码中使用属性?

c++ - 具有 C++ 代码生成和 doxygen 支持的免费 UML 工具

c++ - 删除 std::map (Visual C++)

c++ - 是否有任何理由不扩展 std::set 以添加下标运算符?

python - CPP 调用比 Python 接口(interface)调用慢

visual-studio - 包含OpenSSL作为静态库,但它仍在寻找DLL吗?

mysql - 检测到被阻止的 DLL : MySQL because of No-Installation Download

.net - 有没有办法让应用程序从非托管访问冲突异常中恢复?