【问题标题】:Calling C# from C从 C 调用 C#
【发布时间】:2021-11-04 16:27:17
【问题描述】:

有没有人从 C 模块调用 C# 模块。我尝试在互联网上搜索,但没有找到好的例子。尽管很多网站都说使用 COM 互操作,但找不到合适的示例或文章来解释它。

如果有人可以帮助我,那就太好了

谢谢, 盗贼

【问题讨论】:

    标签: c# c


    【解决方案1】:

    如果您想从 C 或 C++ 调用托管代码,则不仅仅是 COM 互操作。还有以下鲜为人知的方法(取自 MSDN FAQ):

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

    基本上有四种方法 从原生 VC++ 代码调用 .NET 程序集:

    1. CLR Hosting API:原生 VC++ 模块调用 CLR Hosting APIs 来托管 CLR,加载和调用 .NET 程序集(示例代码:CppHostCLR)。

    2. COM Interop:如果 .NET 程序集可以作为 COM 组件公开,则本机 VC++ 模块可以通过 .NET – COM interop 调用 .NET 程序集(示例代码:CppCOMClient) .

    3. 反向 PInvoke:托管代码调用本机代码,传递本机代码可以回调的委托(示例代码:CSPInvokeDll)。

    4. C++/CLI:如果包含原生VC++代码的模块允许enable CLR,原生VC++代码可以调用 .NET 直接组装(示例代码:Consuming C# Library in native C or C++ using C++/CLI

    【讨论】:

    • 感谢您的帮助,我会详细调查并发布我的回复
    • 谢谢,我尝试了 COM 互操作,可以做一个 hello world 类型的应用程序。
    • One Code 和 CLR 托管 API 的链接已损坏。您能否提供更新(我无法找到正确的链接)
    【解决方案2】:

    这里有一个解决方案。该解决方案允许通过使用 [DllExport] 属性(与 P/Invoke DllImport 相对)装饰您的函数来从 C 调用 C# 函数。

    https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

    C#代码

    class Test
    {
         [DllExport("add", CallingConvention = CallingConvention.StdCall)]
         public static int Add(int left, int right)
         {
             return left + right;
         } 
    }
    

    C 代码

     int main()
     {
          int z = add(5,10);
          printf("The solution is found!!! Z is %i",z);
          return 0;
     }
    

    正如@iceflow19 评论如下:

    链接的作者提供了一个 CLR IL 预处理器作为编译期间的附加步骤。由于程序集在 Windows 上使用相同的二进制容器格式 (DLL),因此如果您手动将 IL 中的 .Net 函数偏移量添加到 vtable(dll 的导出列表),Windows 足够智能,可以在调用时调用 CLR 来运行该代码来自 C. 但是有开销。这是一个未经宣传的功能。这就是 C++/CLI 中混合托管库的工作方式。要使用它,只需通过 Nuget 添加它。在您的 MSBuild 项目文件中添加的额外目标将提供 IL 预处理步骤

    【讨论】:

    • 我阅读了那个链接,但他并没有真正使用它的例子。在c项目中加载c#(dll?)代码需要做什么?需要LoadLibraryFreeLibrary等吗
    • 有一个示例 .csproj 文件和 MSBUILD 说明会很有帮助,这将允许学生构建示例应用程序。
    • 我认为这不适用于最新的 .NET,因为它仍然引用 3.5,或者至少我无法使其工作 =(。我认为在 win10 中的一种解决方法是下载 3.5 框架。我现在试试
    【解决方案3】:

    【讨论】:

    • 谢谢,我尝试了 COM 互操作,可以做一个 hello world 类型的应用程序。
    【解决方案4】:

    还可以选择使用 CoreRT 从 C# 代码构建本机库并从 C 中调用它们。 Here 就是一个例子。

    编辑:CoreRT 已移至 runtimelab 功能 NativeAOT。更新链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多