【发布时间】:2010-05-20 12:38:26
【问题描述】:
我有一个用 C# 编写的 DLL,我想将它用于 C# 应用程序和用非托管 VC++ 编写的应用程序。这可能吗?
【问题讨论】:
我有一个用 C# 编写的 DLL,我想将它用于 C# 应用程序和用非托管 VC++ 编写的应用程序。这可能吗?
【问题讨论】:
为了补充此处的其他答案,这是描述您的方案的 MS 支持文章。
【讨论】:
好吧,看来我必须再次提出我的unmanaged exports。 ;-)
2 天前刚刚回复了similar question。这完全适用于 C#,它甚至为 C# 程序集创建一个 .lib 和 .exp 文件,以供 C++ 使用:
internal class Sample
{
[DllExport("_export_test", CallingConvention.Cdecl)]
static int Test(int a)
{
return a + 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)
【讨论】:
您可以使 C# 程序集对 COM 可见,并以这种方式使用它。
在您的 C# 项目属性中,在“Assembly Information”按钮下,选择“Make COM Visible”。
有多种方法可以从 Native C++ 访问 COM 对象,最简单/最好的方法取决于您在做什么以及如何做。
【讨论】: