Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C调用C#_C#_C - Fatal编程技术网

从C调用C#

从C调用C#,c#,c,C#,C,是否有人曾尝试过从C模块调用C#模块。我试着在网上搜索,但没有找到好的例子。虽然很多网站都说类似于使用COM互操作,但却找不到合适的例子或文章来解释它 如果有人能帮我,那就太好了 谢谢, Sveerap您可以将您的C#模块公开为COM: > P/> P>如果要从C或C++调用托管代码,则不仅仅是COM互操作。以下也是鲜为人知的方法(摘自): 强>我如何从本地Visual C++调用.NET程序集?< /P> 基本上有四种方法来解决这个问题 从本机VC++代码调用.NET程序集: CLR宿主

是否有人曾尝试过从C模块调用C#模块。我试着在网上搜索,但没有找到好的例子。虽然很多网站都说类似于使用COM互操作,但却找不到合适的例子或文章来解释它

如果有人能帮我,那就太好了

谢谢, Sveerap

您可以将您的C#模块公开为COM:


<> > P/> P>如果要从C或C++调用托管代码,则不仅仅是COM互操作。以下也是鲜为人知的方法(摘自):

<>强>我如何从本地Visual C++调用.NET程序集?< /P> 基本上有四种方法来解决这个问题 从本机VC++代码调用.NET程序集:

  • CLR宿主API:本机VC++模块调用宿主CLR,加载并调用.NET程序集(示例代码:)

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

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

  • C++/CLI:如果允许包含本机VC++代码的模块访问,则本机VC++代码可以调用 .NET程序集(示例代码:)


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

    C#代码

    C代码

    class Test
    {
         [DllExport("add", CallingConvention = CallingConvention.StdCall)]
         public static int Add(int left, int right)
         {
             return left + right;
         } 
    }
    
     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足够智能,可以在从C调用时调用CLR来运行该代码。但是会有开销。这是一个未经宣传的功能。这就是C++/CLI中混合托管库的工作方式。要使用它,只需通过Nuget添加它。在MSBuild项目文件中添加的额外目标将提供IL预处理步骤


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

    谢谢你的帮助,我会详细研究它们并发布我的回复。我尝试了COM互操作,可以做一个类似hello world的应用程序。一个代码和CLR宿主API的链接已断开。你能提供一个更新吗(我找不到正确的链接)谢谢,我尝试了COM互操作,可以做一个hello world类的应用程序。我读了那个链接,但他没有使用它的实例。您需要在c项目中执行什么操作才能加载c#(dll?)代码?你是否需要
    LoadLibrary
    freebrary
    等。有用的是一个示例.csproj文件加上MSBUILD指令,这将允许学生构建示例应用程序。我认为这不适用于最新的.NET,因为它仍然引用3.5,或者至少我无法使它工作=(.我认为win10中的一个解决方法是下载3.5框架。我现在就试试