2008-09-15 51 views
5

我有一個接口,我在C++中定義了現在需要在C#中實現的接口。什麼是最好的方式去做這件事?我不想在我的界面定義中使用COM。我現在解決這個問題的方法是有兩個接口定義,一個用C++和一個用C#。然後我將C#接口公開爲COM服務器。這是我用C++編寫的應用程序可以調用到C#中。無論如何,我可以避免必須在C++和C#中定義我的實現嗎?在C++中定義需要用C#和C++實現的接口

回答

3

如果您願意爲您的託管代碼而不是C#使用C++/CLI,那麼您可以直接通過頭文件使用本地C++接口定義。這將是多麼容易取決於你的界面到底是什麼 - 最簡單的情況是你可以從C使用的東西。

看看Marcus Heege的Expert C++/CLI: .NET for Visual C++ Programmers,瞭解很多關於混合原生和託管C++的有用信息在.NET中。

+0

還想補充一點,Nishant Sivakumar在C++/CLI中的作用是瞭解如何將C++連接到C#的一個很好的資源。 – Juba 2011-02-04 17:39:03

1

爲什麼你不想使用COM?

這將是我的建議。 COM interop對我來說工作得非常好,我在C#中使用了COM對象和接口(只需引用COM對象並自動創建運行時可調用的包裝器)。反過來,將C#類標記爲「註冊COM互操作」也是如此。

1

在C++中編寫接口並使用宏使其看起來像UNIX上的標準cpp頭文件,並且像windows上的IDL文件(如果這樣做不起作用,則可以始終編寫一個python/ruby​​腳本來生成來自C++頭文件的IDL)。

編譯IDL以生成一個typelib。使用TypeLib導入器爲C#生成接口定義並在其中實現接口。

1

在IDL中編寫接口並使用工具將接口編譯爲目標語言。在查看涉及跨語言接口的CORBA時,您可能會發現這些指針。

/艾倫

0

你沒有提到你正在使用.NET,但東西是我在使用Visual Studio .NET 2003的工作的版本是提供各地的小突起實現的薄C#包裝真正的C++類:

public __gc class MyClass_Net { 
public: 
    MyClass_Net() 
     :native_ptr_(new MyClass()) 
    { 
    } 
    ~MyClass_Net() 
    { 
     delete native_ptr_; 
    } 

private: 
    MyClass __nogc *native_ptr_; 
}; 

顯然,人們會更喜歡使用升壓shared_ptr的有,但我從來沒有讓他們與V.NET 2003發揮很好...

方法簡單地轉發到底層C++方法通過指針。方法參數可能必須轉換。例如,要調用一個接受字符串的C++方法,C#方法可能需要一個System.String(System :: String in Managed C++)。你必須使用System :: Runtime :: InteropServices :: Marshal :: StringToHGlobalAnsi()來做到這一點。

這種方法的一個好處是,因爲Managed C++是一種.NET語言,您可以將訪問器作爲屬性(__property)公開。你甚至可以公開屬性,就像在C#中一樣。

1

另一種方法是使用'扁平',C風格的API。您不妨使用extern "C"來防止意外超載。使用一個DEF文件明確命名導出的函數,所以它們絕對不是以任何方式裝飾的(C++函數在導出表中用參數類型的編碼進行「裝飾」)。

在x86上,請小心調用約定。可能會明確聲明使用__stdcall__cdecl。由於P/Invoke主要用於調用Windows API,因此默認爲StdCall,但C和C++默認爲cdecl,因爲它支持可變參數。

我最近將COM接口IRapiStream封裝在一個扁平的C接口中,因爲.NET似乎試圖將IStream轉換成存儲器,該存儲器因錯誤STG_E_UNIMPLEMENTEDFUNCTION而失敗。

2

Swig是用C#等其他語言包裝C++類的好工具。