2009-11-28 40 views
0

如何在C#中使用C++類?我知道你可以使用DllImport並將類作爲IntPtr,但是如何在類中調用函數呢?而且我不希望創建的類和出口的是,那麼就沒有一點對我來說,使用一個類,那麼每個方法的一種新方法...在C#中使用C++類

,而無需創建一個COM應用

C++類:

class MyCPPClass 
{ 
public: 
    MyCPPClass(); 
    ~MyCPPClass(); 
    void call_me(); 
} 

extern "C" 
{ 
    extern __declspec(dllexport) MyCPPClass* __cdecl CreateClass() 
    { 
    return new MyCPPClass(); 
    } 
} 

C#:

class MyCSClass 
{ 
    [DllImport("MyCPPDll.dll")] 
    static extern IntPtr CreateClass(); 

    public static void Main() 
    { 
    IntPtr cc = CreateClass(); 
    // Now I want to call cc->call_me(); 
    } 
} 

回答

2

如果您正在構建自己的類在C++/CLI,然後你纔剛剛能夠使用它,你將任何常規的.NET類。

如果有問題的DLL可以通過COM訪問,那麼使用COM interop從.NET中與它交談。

如果OTOH你看非COM,普通的香草C++,你必須確保所有類及其成員遠銷...

我的建議是,如果你想使用簡單的香草C++ DLL,編寫一個C++/CLI包裝器,可以將C#代碼和「真正的C++」對話到C++ DLL。您仍然必須導出所有C++類和函數,但至少在轉換到C#之前,您使用相同的語言工作。

0

要使用C++類,C++ \ CLI是一個更好的選擇

0

正如其他人所指出的,C++ CLI可能是最簡單的選擇。

,你已經開始做其他標準的選擇是讓你開始是c風格的建築立面和暴露的另一種方法是這樣的:

extern "C" { 
    extern __declspec(dllexport) MyCPPClass* __cdecl CallMe(void* data) 
    { 
     MyCppClass* instance = (MyCppClass*) data; 
     instance->call_me(); 
    } 
} 

那麼你可以通過創建一個這樣的單調乏味C#類,它反映了C++類的功能,並隱藏了實現在另一個dll中的事實。

或者您可以使用C++/CLI。