2010-12-13 102 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