2010-12-13 64 views
17

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

如果有人能帮助我在此,这将是巨大

感谢, Sveerap

回答

16

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

如何调用来自本机的Visual C .NET程序集++?

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

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

  2. COM互:如果.NET组件可以公开为一个COM组件,天然的VC++模块可以调用通过.NET的.NET组件 - COM互操作(示例代码:CppCOMClient)。

  3. 反向PInvoke的:托管代码调用传递一个委托,它的原生代码可以回调(示例代码:CSPInvokeDll)本地代码。

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

+0

感谢您的帮助,我会详细调查它们并发布我的回复 – sveerap 2010-12-13 11:48:19

+1

谢谢,我尝试过COM互操作,并可以做一个世界各地的应用程序。 – sveerap 2010-12-15 07:09:58

+0

One Code和CLR Hosting API的链接被破坏。你能否提供更新(我无法找到正确的链接) – 2015-11-05 13:09:05

12

这里是一个解决方案。该解决方案允许通过使用[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预处理器为一个附加的s tep在编译期间。由于程序集在Windows上使用相同的二进制容器格式(DLL),因此如果手动将IL中的.Net函数偏移量添加到vtable(dll的导出列表),Windows足够聪明,可以调用CLR以在调用时运行该代码从C.但是有开销。这是一个没有改变的功能。这是C++/CLI中托管库的混合方式。要使用它只需通过Nuget添加它。在你的MSBuild项目文件中添加额外的目标将提供IL预处理步骤

+4

我读了那个链接,但他没有真正使用它的例子。你需要在c项目中加载c#(dll?)代码?你需要'LoadLibrary''FreeLibrary'等。 – weston 2012-09-12 13:26:51

+1

该链接的作者提供了一个CLR IL预处理器作为编译过程中的一个额外步骤。由于程序集在Windows上使用相同的二进制容器格式(DLL),因此如果手动将IL中的.Net函数偏移量添加到vtable(dll的导出列表),windows足够聪明地调用CLR来在调用时运行该代码从C.但是有开销。它是一个未经改变的功能。这是C++/CLI中托管库的混合方式。 要使用它只需通过Nuget添加它。 MSBuild项目文件中添加的额外目标将提供IL预处理步骤。 – iceflow19 2016-01-09 06:53:45

+0

我认为,你的评论是重要的添加回答身体。谢谢你。 – MajesticRa 2016-01-10 18:00:28