在项目 c++ 中使用 c# dll
Posted
技术标签:
【中文标题】在项目 c++ 中使用 c# dll【英文标题】:using c# dll in project c++ 【发布时间】:2010-09-26 21:32:59 【问题描述】:我想在 c++ 项目(visual studio 2003) 中使用 c#(visual studio 2008) 制作的 dll。怎么做 ?请帮忙
【问题讨论】:
How to use c# Dll in vc++??的可能重复 Is it possible to use a DLL created using C# in an unmanaged VC++ application?的可能重复 @0xA3:我很好奇,VC++ 2008 如何让事情变得更简单? VC 2003 编译的代码可以包含 COM 组件,它可以包含任何类型的本地包装 DLL,即使它是用 VC2008 编写的,对吧? @nikie:据我所知,VC++ /CLR 选项要求 C++ 和 C# dll 使用相同的 .NET 运行时版本。 VS2003 仍然针对旧的 .NET 1.1。 @0xA3: 是的,但他可以在 VC 2008 中编写 C++/CLR 包装 DLL,并将其包含在他现有的 VC2003 项目中,而无需升级他现有的项目。 【参考方案1】:不仅仅是 COM 互操作,MSDN FAQ 还列出了鲜为人知的方法:
2.2 如何从原生 Visual C++ 调用 .NET 程序集?
基本上有四种方法 从本机 VC++ 调用 .NET 程序集 代码。 Microsoft All-In-One Code Framework 有工作示例 演示方法。
本机 VC++ 模块调用 CLR Hosting APIs 来托管 CLR、加载和 调用 .NET 程序集。 (一体 代码框架示例代码: CppHostCLR)
如果 .NET 程序集可以作为 COM 组件公开,本机 VC++ 模块可以调用 .NET 通过 .NET 组装 – COM 互操作。 (多合一代码框架示例 代码:CppCOMClient)
反向 PInvoke:托管代码调用本机传递委托 本机代码可以回调。 (多合一代码框架示例 代码:CSPInvokeDll)
如果包含原生VC++代码的模块允许enable CLR,原生VC++代码可以调用 .NET 程序集直接通过“它 Just Works”或“IJW”机制。 (多合一代码框架示例代码:CppCLIWrapLib)
【讨论】:
【参考方案2】:您不能直接使用非托管 C++ 代码中的 .NET 程序集。一种可能的解决方案是使用 regasm.exe 实用程序将程序集公开为 COM 对象,然后从 C++ 中使用它。请注意,需要作为 COM 对象公开的 .NET 类型可能需要使用 [COMVisible(true)]
属性进行修饰,并且仍需要在运行 C++ 代码的目标计算机上安装 .NET 框架。
【讨论】:
【参考方案3】:有很多方法可以做到这一点。
C# DLL 是 COM DLL 吗?如果是这样,您可以使用常规 COM API/规范在您的 C++ 程序中访问它。有很多关于使 C# DLL COM 可见的教程。没那么难,基本就是几个编译开关和C#属性。
否则,您可以使用/clr 编译器开关编译您的C++ 项目吗?如果是这样,您可以使用Using Directive 直接导入您的 C# DLL。
【讨论】:
【参考方案4】:正如 Darin 所说,一种方法是通过 COM。其他两种方式(我知道)是:
您可以在 C++ 中创建混合模式 DLL。该 DLL 可以包含和调用托管代码,但它也可以导出非托管函数,就像普通的 C++ DLL 一样。它可以像任何其他 C++ DLL 一样被包含 要困难得多,但您也可以托管 CLR。谷歌“CLR 托管”以查找有关 API 或示例的详细信息。【讨论】:
【参考方案5】:在将“Resolve #using References”(Project->C/C++->General) 编译器选项设置为包含所需程序集的目录之后,然后在代码中添加这样的一行。
#using <NiftyAssembly.dll>
【讨论】:
【参考方案6】:制作库文件 [.Tlb ] 文件,然后只有我们可以使用 dll。您必须制作原始 c# DLL 的 .TLB(类型库文件)并在 VC++ 代码中使用该 .TLB 库。为此,您必须在您的电脑上注册 .TLB 文件,并且必须在您的 vc++ 应用程序中导入该 .TLB 文件。 在编写 C# DLL 时,请记住使用将在类中实现的接口。
【讨论】:
以上是关于在项目 c++ 中使用 c# dll的主要内容,如果未能解决你的问题,请参考以下文章