在C++项目中使用C# DLL

10

我想在 C++ 项目(Visual Studio 2003)中使用由 C#(Visual Studio 2008)制作的 DLL。如何实现?请帮忙!


2
可能是如何在vc++中使用c# Dll?的重复问题。 - Hans Passant
@0xA3:我很好奇,VC++ 2008怎么会让事情变得更容易呢?在VC 2003中编译的代码可以包含COM组件,并且它可以包含任何类型的本地封装DLL,即使它是用VC2008编写的,对吗? - Niki
据我所知,VC++ /CLR选项要求C++和C# dll都使用相同的.NET运行时版本。VS2003仍然针对旧的.NET 1.1。 - Dirk Vollmar
@0xA3:没错,但他可以在VC 2008中编写C++/CLR包装器DLL,并将其包含在现有的VC2003项目中,而无需升级现有项目。 - Niki
6个回答

13

除了COM互操作,MSDN FAQ还列出了一些不太为人知的方法:

2.2 如何从本机的Visual C++调用.NET程序集?

基本上有以下四种方法可以从本机VC++代码中调用.NET程序集。Microsoft All-In-One Code Framework提供了演示这些方法的工作示例。

  1. 本机VC++模块通过调用CLR Hosting APIs 来托管CLR,加载并调用.NET程序集。(All-In-One Code Framework示例代码:CppHostCLR)

  2. 如果.NET程序集可以公开为COM组件,则本机VC++模块可以通过.NET-COM互操作调用.NET程序集。(All-In-One Code Framework示例代码:CppCOMClient)

  3. 反向PInvoke:托管代码调用本机代码并传递一个委托,本机代码可以回调。(All-In-One Code Framework示例代码:CSPInvokeDll)

  4. 如果包含本机VC++代码的模块被允许启用CLR,则本机VC++代码可以通过“只需这样”,或“IJW”机制直接调用.NET程序集。(All-In-One Code Framework示例代码:CppCLIWrapLib)


1

你不能直接在非托管的 C++ 代码中使用 .NET 程序集。一种可能的解决方案是使用 regasm.exe 工具将程序集公开为 COM 对象,然后从 C++ 消费它。请注意,需要作为 COM 对象公开的 .NET 类型可能需要使用 [COMVisible(true)] 属性进行装饰,并且仍然需要在运行 C++ 代码的目标计算机上安装 .NET Framework。


1

有许多方法可以做到这一点。

C# DLL是COM DLL吗?如果是,您可以使用常规的COM API/规范在C++程序中访问它。有许多关于使您的C# DLL COM可见的教程。它不是那么困难,基本上只需要几个编译开关和C#属性。

否则,您能够使用/clr编译器选项编译您的C++项目吗?如果是,您可以使用Using Directive直接导入您的C# DLL。


1

正如Darin所说,一种方法是通过COM。我知道的另外两种方法是:

  • 您可以在C++中创建混合模式DLL。该DLL可以包含和调用托管代码,但它也可以导出未管理的函数,就像普通的C++ DLL一样。它可以像任何其他C++ DLL一样被包含。
  • 这很困难,但您也可以托管CLR。搜索“CLR托管”以查找有关API或示例的详细信息。

1
在将"解析#using引用"(项目->C/C++->常规)编译器选项设置为包含所需程序集的目录后,您需要在代码中添加以下行。
#using <NiftyAssembly.dll>

0
制作库文件 [.Tlb] 文件,然后我们才能使用 DLL。您必须制作原始 C# DLL 的 .TLB(类型库文件),并在 VC++ 代码中使用该 .TLB 库。为此,您必须在计算机上注册 .TLB 文件,并将其导入到您的 VC++ 应用程序中。
在编写 C# DLL 时,请记得使用将在类中实现的接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接