如何设计一个包装类来使用 C++ 应用程序以使用 C# DLL?

Posted

技术标签:

【中文标题】如何设计一个包装类来使用 C++ 应用程序以使用 C# DLL?【英文标题】:How can I design a wrapper class for consuming a C++ application to use a C# DLL? 【发布时间】:2020-08-14 23:03:55 【问题描述】:

我按照以下教程 https://www.red-gate.com/simple-talk/dotnet/net-development/creating-ccli-wrapper/ 使用包装类从 C# .NET 框架控制台应用程序创建 C++ 静态库的实例。在本教程中,ManagedObject.h 文件为从非托管到托管的包装类创建了一个模板。我将如何创建一个从托管到非托管的模板——如果这是不可能的,任何用于创建包装类以从 C# DLL 转到 C++ 应用程序使用的链接将不胜感激!

【问题讨论】:

澄清一下,您想要一种在 C++ 普通(不是 CLI)项目中使用 C# .NET 代码的方法吗? 正确——是的(使用非托管 C++ 项目中的 C# 代码) 也许这个链接会有帮助? codeproject.com/Tips/695387/… 【参考方案1】:

就像你提到的链接,似乎唯一的方法是创建 3 个项目。

首先,创建一个 C# 类库项目并创建一些公共库,例如:

Commands.cs:

using System;
public static class Commands

    public static void PrintMsg() => Console.WriteLine("Hello");

然后,创建一个 C++/CLI 项目(包装器项目)。 在包装器项目中,创建一些函数来使用您的类并导出它们(我不确定是否需要extern "C",但我会使用它)。

包装器.cpp:

extern "C" __declspec(dllexport) void printMsg()

    Commands::PrintMsg();

在您的 C++ 非托管项目中,引用您的包装项目并导入函数(并使用它们)。

main.cpp:

extern "C" __declspec(dllimport) void printMsg();

int main()

    printMsg();
    return 0;

输出:你好

【讨论】:

抱歉,具体说明:我如何才能批量导入类而不是逐个方法? 我不认为你可以,但它是 C++,所以你可以为每个函数创建一个带有 _declspec(dllexport) 的类的副本并将其导入到头文件中。混合托管和非托管代码需要做很多工作,这就是为什么人们通常只使用C++/CLI,或者创建一个非托管DLL并在C#中使用DllImportAttribute

以上是关于如何设计一个包装类来使用 C++ 应用程序以使用 C# DLL?的主要内容,如果未能解决你的问题,请参考以下文章

如何围绕 C++ 代码编写 C 包装器以公开类方法

C# 中的非托管 C++ 类

如何用 Cython 包装 C++ 类?

C# 包装类和来自 c++ 的 dllimport

使用 C++ 包装器时如何访问 C# .dll 属性

如何从另一个包装的对象返回 Cython 中的包装 C++ 对象?