c# - 为 DLL 制作 .NET 包装器

标签 c# c++

我有一个使用 Qt 在 C++ 中创建的 DLL。但是我有项目文件可以在 Visual Studio 中打开它并进行编辑等等。我希望能够在我正在制作的 C# 应用程序中使用这个库。那么,我需要对项目做些什么才能使其在 C# 应用程序中可引用?

我正在阅读有关 PInvoke、制作 .NET 包装器等的各种信息,但我不确定最佳选择是什么以及如何做。

最佳答案

您可以通过在您的解决方案中创建一个新的 C++/CLI 项目来为 C++ 类创建 .NET 包装器类,并且对于您实际需要包装器的每个类,添加一个新项 Managed.ClassName.cpp 并检查下面的模式。

Managed.Rand.cpp(这将是您的 C++/CLI 项目中的一个新文件,并假定您的 native 项目称为“Logic”和 Rand 类在 Logic 命名空间中)

#include "../Logic/Rand.cpp"

using namespace System;

namespace Logic {
    namespace Managed {
        public ref class Rand {
            Logic::Rand * rand;
        public:
            Rand(UInt32 seed) { rand = new Logic::Rand(seed); }
            !Rand() { delete rand; }
            ~Rand() { this->!Rand(); }

            // Wrapper methods
            UInt32 Next() { return rand->Next(); }
        };
    }
}

请记住 !ClassName 方法(某种析构函数)会导致类自动实现 IDisposable,因此您应该包装 Managed.ClassName 的实例 在 using 构造中,或者在完成后对它们调用 Dispose。简而言之,通常的 IDisposable 使用模式适用于此。

关于c# - 为 DLL 制作 .NET 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27370153/

相关文章:

c# - 检查文件是否存在不知道扩展名

c++ - 从满足谓词的迭代器中均匀随机地从容器中获取迭代器

c++ - 为什么总是避免在C/C++中使用多维数组进行数值计算?

c++ - 如何将 vector 写入文件以供执行程序时使用? (c++)

c# - LINQ:将 DataTable 转换为包含数组的用户定义类

c# - 无论图像颜色如何,在图像上绘制可见文本

c# - 我们可以解码 Guid 以找出它是在何时何地生成的吗?

c# - TLS/SSL - C# - 如何对远程 sql server 执行查询?

c++ - 如何使用带有引用的函数指针创建 std::thread ?

c++ - Linux - 获取线程堆栈内存的开始和结束