是否有可能在非托管VC++应用程序中使用使用C#创建的DLL?
您可以使C#程序集对COM可见,并以此方式使用它。
在C#项目属性的“Assembly Information”按钮下,选择“Make COM Visible”。
有很多方法可以从Native C++访问COM对象,最简单/最好的方法取决于你在做什么和如何做。
+1 - 这几乎是它。 COM interop几乎是这种情况下唯一明智的方式。 – TomTom 2010-05-20 12:42:06
-1,没有评论。 。 。怎么会这样?如果我的答案有问题,请你让我知道吗?我们都在这里学习,谢谢。 – 2010-05-20 12:45:57
感谢您的回复,我将使用这种方法。 :) – 2010-05-20 14:09:15
有不仅仅是COM互操作越多,MSDN FAQ还列出了鲜为人知的方法:
2.2如何调用来自本机的Visual C .NET程序集++?
基本上有四种方法可以从本地VC++ 代码调用.NET程序集中的 。微软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组件可直接通过“它 只是作品“或”IJW“机制。 (多功能一站式示例代码库示例代码:CppCLIWrapLib)
嗯,看来我不得不再次提到我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;
}
}
哇!真?我假设C#需要被标记为不安全?我没有想到你可以做到这一点。 – 2010-05-21 12:18:14
该程序集将包含不安全的位,但在用作.Net程序集时不会被认为是不安全的。您仍然可以将它用作普通的x86或x64(不是AnyCPU)程序集,并包含所有类和东西。但是,如果将它作为真正的DLL加载,它将表现得像一个一样。这是不安全位开始的地方。 – 2010-05-21 13:56:46
+1:非常棒的google-fu!这个链接正是马修所需要的。 – 2010-05-20 12:44:36
@Binary Worrier - 我担心我会踩着你的脚趾,上面的链接,因为它看起来像你要编辑你的答案。 – 2010-05-20 12:49:25
荣誉伙计,最快的手指赢了:) – 2010-05-20 13:07:50