【问题标题】:How to call C# code in C++如何在 C++ 中调用 C# 代码
【发布时间】:2013-05-10 18:23:27
【问题描述】:

我有一个小型 C# 类 (Gram.cs),它正在使用第 3 方 dll 来操作设备。现在,我需要使用 C++ 调用这个 C# 类中的一些函数。

我该怎么做?

我使用的是 MS Visual Studio 2010 专业版。

【问题讨论】:

  • 看看你的场景,你真的不需要 C#类调用C++函数吗?
  • @gustavodidomenico:不,来自 C++ 的 C#
  • @pmni:如何将 C# 文件添加到项目中?
  • 如果 C# 类是 small,并且它处理本机 dll,它可能会更简单地用 C++ 重写该类,然后将 .Net 与您的应用程序集成。

标签: c# c++ visual-studio-2010 dll usb


【解决方案1】:

如果C# 类很小,并且它处理本机dll,它可能会更简单地在C++ 中重写该类,而不是将.Net 集成到您的应用程序中。此外,集成.Net 将强制启动整个.Net 虚拟机,仅用于处理您的简单类。

否则,

  • 您可以使用 COM 互操作:基于您的 C# 类构建程序集并使其 COM 可见。然后您可以将类用作 COM 对象。
  • 您可以使用托管 C++ 在托管代码和非托管代码之间进行封装。
  • 您可以反转控制流,因此C# 代码将调用非托管函数。在这种情况下,您可以将其从二进制文件中导出,然后从具有DllImport 属性的C# 代码中导入。

【讨论】:

    【解决方案2】:

    通常你应该在你的 c# 项目设置中让你的 c# 代码作为 COM 可见,并使用 c# IJW regasm 工具。

    查看http://msdn.microsoft.com/en-IN/library/ms173185.aspx

    几年前我使用这种方法将 c# 集成到 c++ 中。

    您将能够在您的 c++ 代码中将您的 c# 程序集作为 COM 组件加载。

    【讨论】:

      【解决方案3】:

      这可能就是你要找的东西(我之前在这里回答过类似的问题:how to : use c++ projects for windows phone (C#)

      a) 直接从 C 库中加载符号,例如:

      using System;
      using System.Runtime.InteropServices;
      static class win32
      {
          [DllImport("kernel32.dll")]
          public static extern IntPtr LoadLibrary(string dllToLoad);
      
          [DllImport("kernel32.dll")]
          public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
      
          [DllImport("kernel32.dll")]
          public static extern bool FreeLibrary(IntPtr hModule);   
      }
      

      (摘自:http://www.andyrushton.co.uk/csharp-dynamic-loading-of-a-c-dll-at-run-time/,经过简短的谷歌搜索)

      为此,您需要将 C++ 接口方法导出为“C”,例如:

      extern "C" __declspec( dllexport ) int MyFunc(long parm1);
      

      (来自 MSDN:http://msdn.microsoft.com/en-us/library/wf2w9f6x.aspx

      b) 在 C++/CLI 中使用包装器将非托管 C++ 连接到托管 C#:

      这是一个很好的例子:http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes

      请注意,乍一看语法有些奇怪,而且不是所有东西都可以使用。但是,您获得的是使用 C++ 类的能力 - 导出“C”会禁止您这样做。

      【讨论】:

      • 这不是问题的完全相反吗?
      • @JohnDemetriou 是正确的,因为那是前一阵子,我不知道我为什么要这样回答。快速浏览问题的 cmets 表明有人提到在 C++ 中重写 C#-interface-y 部分,从 C# 调用,所以可能就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多