2011-06-23 42 views
0

我試圖避免使用COM。我正在C++ exe上設計混合C#和C++控件。我可以使用C風格方法將C++接口導出到C#dll

我想到的一個方法是從C#中調用我的C++ EXE,並將窗口消息發送到C#窗口。然而,我在控件基類上調用的方法數量太長,無法證明Windows消息的合理性。

因此,如果可以將整個C#接口導出到C++ EXE,那將更容易。

我想避免使用COM,因爲我可能不得不支持Windows 2000,而不依賴於清單的情況下進行COM會成爲當前在註冊表中沒有設置太多的軟件包上的部署麻煩。

+0

太糟糕了你不能使用COM,因爲它會使這個微不足道。 –

+0

是你想避免使用註冊表的唯一問題?通常,COM使用註冊表進行CoCreate和跨公寓編組;但如果你不需要做這些(例如,可以使用P/Invoked API而不是CoCreate),那麼你將不會碰到註冊表,並且仍然可以使用CLR的COM interop支持的其餘部分。 – BrendanMcK

回答

0

我在VS 2010中使用C++/CLI來做到這一點。你可以公開一個可以以通常方式使用的DLL C接口,實現只需將數據從該接口編組到C#程序集。

相關的問題,我覺得Calling C# from C++, Reverse P/Invoke, Mixed Mode DLLs and C++/CLI

+0

我們確定你的意思是我可以用所有抽象方法制作一個C++抽象類,並讓C#調用這些方法。如果可以的話,我正在嘗試動態多態。 –

1

你可以寫爲每個C++控制的C包裝和PInvoke的從C#。

例如這個C++類:

class Example 
{ 
    public: 
    int MyMethod(int param); 
} 

,並在你的c一的extern 「C」 塊++ EXE:

void * CreateExample() { return new Example(); } 
int Example_MyMethod(void * handle, int param) { reinterpret_cast<Example*>(handle)->MyMethod(param)); } 

,並在C#:

public class Example 
{ 
private IntPtr handle; 

public Example() 
{ 
    handle = _CreateExample(); 
} 

public int MyMethod(int param) 
{ 
    return _MyMethod(param); 
} 

[DllImport("yourdll.exe")] 
private static extern IntPtr _CreateExample(); 

[DllImport("yourdll.exe")] 
private static extern int _MyMethod(IntPtr handle, int param); 
}