2017-03-05 14 views
1

我有一個包裝庫,它使用調用非託管C++的C++/cli。 我從c#調用這個,並希望作爲ref傳遞一個int數。C#到C++/cli unamanged C++參考

public void MethodA() 
{ 
    int result = 0; 
    MethodCLI(ref result); 
} 

public void MethodCLI(int result) 
{ 
    //Singature of the method is 
    // UnmanagedC++(int* result); 
    UnmanagedC++(result); 
} 

我該怎麼做?提前

回答

1

如果該值更新需要

由於被傳播回C#代碼(所以ref關鍵字是有道理的),那麼你必須聲明的C++/CLI參數作爲int% result。原生C++中的int&的確切語法等價物。

但是,它可能在運行時是一個「內部指針」。例如,您可以在您的C#代碼中傳遞一個類對象的字段。存儲在GC堆上,這是一個重要的細節。 GC可能在本機代碼運行時運行(例如由另一個線程觸發),並在壓縮堆時移動對象。這會使指針失效。如果您嘗試將result直接傳遞給本機函數,C++/CLI編譯器不會讓這種情況發生並且會大聲抱怨。 C++/CLI設計人員爲受管參考選擇不同符號的基本原因(^ vs *% vs &)。

提供一個穩定的指針是必需的,最簡單的方法是將指針傳遞給一個未存儲在GC堆中的值。就像這樣:

public: 
void MethodCLI(int% result) 
{ 
    int temp = result; 
    UnmanagedFunction(&temp); 
    result = temp; 
} 

,如果你需要傳遞一個對象,而不是一個值的pin_ptr關鍵字變得有用,它暫時銷傳遞的對象,因此GC可能指針不壞。

+0

謝謝。那就是訣竅 – pantonis