【问题标题】:Is it possible to use a DLL created using C# in an unmanaged VC++ application?是否可以在非托管 VC++ 应用程序中使用使用 C# 创建的 DLL?
【发布时间】:2010-05-20 12:38:26
【问题描述】:

我有一个用 C# 编写的 DLL,我想将它用于 C# 应用程序和用非托管 VC++ 编写的应用程序。这可能吗?

【问题讨论】:

    标签: c# c++ dll


    【解决方案1】:

    为了补充此处的其他答案,这是描述您的方案的 MS 支持文章。

    http://support.microsoft.com/kb/828736

    【讨论】:

    • +1:优秀的谷歌福!该链接正是 Matthew 所需要的。
    • @Binary Worrier - 我担心上面的链接会踩到你的脚趾,因为看起来你要编辑你的答案。
    • 恭喜老兄,最快的手指赢了:)
    【解决方案2】:

    好吧,看来我必须再次提出我的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# 需要标记为不安全?我完全不知道你能做到这一点。
    • 该程序集将包含不安全位,但在用作 .Net 程序集时不会被视为不安全。您仍然可以将它用作普通的 x86 或 x64(不是 AnyCPU)程序集,与您的所有类和东西一起使用。但是,如果您将它作为一个真正的 DLL 加载,它的行为会像一个。这就是不安全位开始的地方。
    【解决方案3】:

    不仅仅是 COM 互操作,MSDN FAQ 还列出了鲜为人知的方法:

    2.2 如何从原生 Visual C++ 调用 .NET 程序集?

    基本上有四种方法 从本机 VC++ 调用 .NET 程序集 代码。 Microsoft All-In-One Code Framework 有工作示例 演示方法。

    1. 本机 VC++ 模块调用 CLR Hosting APIs 来托管 CLR、加载和 调用 .NET 程序集。 (一体 代码框架示例代码: CppHostCLR)

    2. 如果 .NET 程序集可以作为 COM 组件公开,本机 VC++ 模块可以调用 .NET 通过 .NET 组装 – COM 互操作。 (多合一代码框架示例 代码:CppCOMClient)

    3. 反向 PInvoke:托管代码调用本机传递委托 本机代码可以回调。 (多合一代码框架示例 代码:CSPInvokeDll)

    4. 如果包含原生VC++代码的模块允许enable CLR,原生VC++代码可以调用 .NET 程序集直接通过“它 Just Works”或“IJW”机制。 (多合一代码框架示例代码:CppCLIWrapLib)

    【讨论】:

      【解决方案4】:

      您可以使 C# 程序集对 COM 可见,并以这种方式使用它。

      在您的 C# 项目属性中,在“Assembly Information”按钮下,选择“Make COM Visible”。

      有多种方法可以从 Native C++ 访问 COM 对象,最简单/最好的方法取决于您在做什么以及如何做。

      【讨论】:

      • +1 - 差不多就是这样。在这种情况下,COM 互操作几乎是唯一明智的方式。
      • -1,无评论。 . .怎么会这样?如果我的回答有问题可以告诉我吗?我们都在这里学习,谢谢。
      • 感谢您的回复,我将使用这种方法。 :)
      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多