如何设计一个包装类来使用 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?的主要内容,如果未能解决你的问题,请参考以下文章