2012-10-24 96 views
2

我想要非託管C++代碼來調用C#函數作爲回調。我有一個CLI/C++類封裝非託管代碼。這個CLI/C++類的一個實例存在於C#中。如何將C#函數指針傳遞到CLI/C++代碼?

C#代碼看起來像下面的文本。我有一個(委託)指向callBack方法的函數指針。我有CLI_class的CLI實例。我想在addValueChangedCallBack函數中以某種方式給它一個函數指針。

public Setup(){ 
    tempFUNC myFuncObj = new tempFUNC(callBack) 
    CLI_class c=new CLI_class(); 
    c.addValueChangedCallBack(myFuncObj) 
} 

public delegate void tempFUNC(float x); 

void callBack(float x){ 
.... 
} 

然後在命令行代碼,我想要做這樣的事情:

void addValueChangedCallback(void (*ManipCallBack)(float)){ 
    unmanagedCPPCLASS.addValueChangedCallback(ManipCallBack) 

} 

我怎樣才能把函數指針到C++指針(*)?另外,我不能在C++/CLI項目中引用C#項目,因爲C#類已經引用並使用C++/CLI項目。會不會有依賴性問題?

我曾在某些網站上看到有關'編組數據'或使用'互操作'的參考資料。我不明白他們是如何工作的,或者他們從我見過的任何事情上做了什麼,這些是我應該使用的嗎?

+0

我想嘗試創建一個正確的簽名,隨後調用C#函數的包裝C++函數。在使用C++/CLI時,你不應該需要編組或者互操作,整個過程就是讓編譯器使用語言擴展來處理它。 – millimoose

+0

在C++/CLI代碼中聲明委託類型,這樣就不會對C#程序集有依賴性。公開。使用Marshal.GetFunctionPointerForDelegate()來獲取可傳遞給本機代碼的指針。不要忘記存儲傳遞的委託對象以保持它的引用。 –

+0

[C++/cli傳遞(託管)委託給非託管代碼的可能的重複](http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code) –

回答

0

您可以讓兩個項目互相引用並使用System.InteropServices.Runtime.Marshal.GetFunctionPointerForDelegate來獲取函數指針。

但是,如果我是你,我會讓C#類ComVisible,並讓C++代碼直接通過COM接口調用C#方法。這樣就不需要C++/CLI包裝器。正如你正在經歷的那樣,包裝器總是很痛苦。 C++/CLI有其用處,但創建包裝器不是它。

+0

非常感謝你!如果在Visual Studios中有一種特殊的方法可以相互引用,你會不會覺得你會這樣?或者他們應該引用dll? – AAB

+0

項目應相互引用。您可以通過在解決方案資源管理器中右鍵單擊項目名稱並選擇**添加引用... ** – user1610015

+0

當我嘗試完成此操作時,Visual Studios表示它無法將項目引用添加到項目中,因爲它會導致循環依賴。有沒有其他方法可以做到這一點? – AAB