2010-04-27 131 views

回答

1

RE:如何從非託管C++應用程序調用託管C#代碼?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.interop/2005-05/msg00030.html

中調用託管的.NET C#COM從非託管C++代碼對象...

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

結束語託管的C#DLL的非託管C++項目:DLL。

http://www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

+0

我跟着你提供的第二個鏈接,併成功編譯cpp文件但未能運行它。它在使用smartpointer的CreateInstance()失敗.....所以iam無法調用c#dll的函數 – user186246 2010-04-27 09:35:56

+2

請在這裏發佈一個解決方案或至少它的總結。該鏈接將來可能會被打破。而且在這裏閱讀所有解決方案也更容易。如果他們不止一個,你可以發佈他們作爲多個答案。謝謝! ;) – bluish 2015-09-15 14:07:56

8

或者使用project of mine,讓C#創建非託管的出口。那些可以被消費,就好像它們是用母語書寫的一樣。

+0

嗨,這看起來很有趣。您是否有VS 2010的版本,或者您可以指出我需要做哪些更改才能使其適用於VS 2010/Net 4?謝謝 – bzamfir 2011-12-13 23:00:19

+0

應該工作得很好(我在2010年使用它myyself),但是您可能想要將新創建的項目的目標框架更改爲4.0。沒有目標框架設置時,VS 2010默認爲.Net 2.0。 – 2011-12-14 10:53:28

+0

非常感謝。我看到了(我創建了一個示例測試空項目,但未測試它是否工作) – bzamfir 2011-12-15 12:37:32

5

我首先使用了COM interop,但現在我切換到了IJW(它正常工作),因爲它更簡單。我有一個包裝C++/CLR DLL(用/ clr編譯)。

一個簡單的例子(使用靜態打的電話更容易):

namespace MyClasses  
{ 
    public class MyClass 
    { 
     public static void DoSomething() 
     { 
      MessageBox.Show("Hello World"); 
     } 
    } 
} 

在我可以引用命名空間如下的DLL:

using namespace MyClasses; 

,並稱之爲:

__declspec(dllexport) void CallManagedCode() 
{ 
    MyClass::DoSomething(); 
} 

現在您有一個非託管DLL導出「CallManagedCode」,它調用託管代碼。

當然,您還必須在託管/非託管邊界之間轉換數據。從VS2008開始,Microsoft包含一個用於在非託管和託管類型之間轉換的編組助手。請參閱http://msdn.microsoft.com/en-us/library/bb384865.aspx

+0

您並不需要手動進入該路線。看看我的回覆中的鏈接。完全可以在C#中使用DllImport的對應部分,包括.NET中的所有編組優點。我的MSBuild任務在構建之後添加相應的vt-fixups,並且不需要部署另一個程序集... – 2010-04-27 13:00:30

+0

我試過了:該DLL有導出。但是,我該如何使用它?我沒有找到.lib來允許我鏈接到DLL。 – 2010-04-28 12:33:32

+0

我不使用C++,但我想它與任何不帶C/C++頭文件的庫都沒有任何區別:爲您想要導入的函數編寫頭文件。正如我所說,我不使用C++。這是從C或德爾福相當簡單。 – 2010-04-28 16:10:11

2

我使用的是C++/CLI包裝類described here,實現起來相對容易。

+2

請在這裏發表一個解決方案或至少它的總結。該鏈接將來可能會被打破。而且在這裏閱讀所有解決方案也更容易。如果他們不止一個,你可以發佈他們作爲多個答案。謝謝! ;) – bluish 2015-09-15 14:12:41