2014-05-12 63 views
8

似乎必須有一個重複的問題,但我一直沒能找到它。通過引用從C++/CLI傳遞給C#

我正在編寫一個橋樑讓舊的C程序訪問一些C#對象。橋是用C++/CLI編寫的。

在一種情況下,存在這樣的已定義爲C#功能:

public static string GetNameAndValue(out int value); 

我的C++/CLI包裝函數:

char* GetNameAndValue(int* value); 

這是很容易從C呼叫,但我怎麼從C++/CLI調用C#方法?

我第一次嘗試了很明顯的:

String^str; 
str = TheObject::GetNameAndValue(value); 

這給了我錯誤C2664:無法從 '詮釋*' 到 '廉政%' 轉換參數2。

好的,那麼GetNameAndValue(%value)怎麼樣?這給了我錯誤C3071:運算符'%'只能應用於ref類或值類型的實例。

不夠公平。所以如果我創建一個int我可以通過%

int foo; 
str = TheObject::GetNameAndValue(%ix); 

沒有骰子。再次C3071。其中我覺得奇怪,因爲int絕對是的一種值類型。或者是?

必須有%,^,&或一些其他淫穢的魔術組合,將做我想做的事情,但在這個事情發誓30分鐘後,我很難過。在Google搜索C++/CLI和C#的不同組合大多提供了有關如何從C#調用C++的信息。

SO,我的問題:你如何將C++/CLI中的int傳遞給期望out int(或ref int,如果必須的話)的C#方法?

+1

你有事情嚴重倒退。 C++/CLI很容易讓C程序調用C#方法。它是從託管代碼到本地代碼的另一種方式的語言擴展。從本地程序運行託管代碼需要更大的武器,它必須首先加載並初始化CLR。這將需要超過30分鐘才能理清。 –

+1

@HansPassant:這不是我在短時間內的工作經驗。我的C程序調用一個用C++/CLI編譯的DLL,而C++/CLI又調用另一個程序集中的C#代碼。工作得很好。據我瞭解,C++/CLI DLL加載運行時。無論如何,我已經能夠將C#代碼中的信息返回給C代碼。 –

+0

C++/CLI支持__declspec(dllexport),這是我能想到的唯一場景,您可以從中獲得好運。與Giesecke的[DllExport]黑客相同的想法。正如所發佈的,你的問題對我來說毫無意義,你遇到的問題完全正常。祝你好運。 –

回答

5

C#:

class MyClass 
{ 
    public static string GetNameAndValue(out int value); 
} 

C++/CLI:

int value; 
String^ x = MyClass::GetNameAndValue(value); 

C++/CLI包裝:

CString GetNameAndValue(int* value) 
{ 
    String^ x = MyClass::GetNameAndValue(*value); 
    return CString(x); 
} 

C++/CLI封套2:

CString GetNameAndValue(int& value) 
{ 
    String^ x = MyClass::GetNameAndValue(value); 
    return CString(x); 
} 

這對C#「ref」是一樣的。

+0

那*完全*不明顯!所以當我執行'MyClass :: GetNameAndValue(* value)'時,編譯器會自動封送它爲''[out] System :: Int32''嗎?它會花一點時間來測試,但如果它有效,我會接受答案。 –

+2

就像調用C++一樣:「void x(int&);」通過傳遞變量「int v;」。機制是一樣的。沒有演員。對於編譯器來說,所需的原型與定義的原型相同。 –

+0

更重要的是ref和out之間的唯一區別是,強迫你在方法內部分配變量。否則,您可以將ref視爲C++&。順便說一句,我使用C++,C++/CLI,C#一段時間,並且實際上不需要使用%符號,您可以在C#或C++中定義它。所以在C++/CLI中,唯一需要關注的附加引用類型符號是^。 –

0

我知道這已經回答了,但只是爲了澄清編譯器提示「C2664:無法將參數2從'int *'轉換爲'int%'」。
我認爲它希望這個(C++/CLI):

int a=5 
int% foo=a; 
str = TheObject::GetNameAndValue(foo); 
+0

不是。它是一個引用參數,可以綁定到一個左值。你不需要在調用者中創建另一個引用......並且參數**不會綁定到調用者的引用。 –

+1

我的文章的重點和目的是明確而清晰的,沒有花哨的條款。你當然是對的,但很有學術價值。我認爲簡單的甚至過分平凡的例子都更好。這實際上是MSDN的問題:它是以一種非常學術的方式編寫的,因此它是反直覺的,很難在短時間內掌握。這就是爲什麼我們有像這樣的網站。 – Pifcnt