2011-05-21 146 views
3

我只使用C++/CLI在VS2010中單元測試非託管C++代碼。我將編譯器切換到/ clr並使用靜態庫中的非託管代碼。如何將託管引用傳遞給C++/CLI中的非託管代碼?

我在測試類中有一個簡單的int屬性。 我想將它作爲const int &傳遞給本機C++中的函數。但它不能編譯,我發現,這是因爲你不能混合這樣的引用。

這樣做的方法是什麼,我試圖跟隨和它的工作,但有沒有更好的方法?

[TestClass] 
public ref class MyTestClass 
{ 
private: 
    int _my_property; 
public: 

    [TestMethod] 
    void MyTestMethod() 
    { 
     MyNativeClass c; 
     // c.SomeMethod(_my_property) this doesn't work 

     int i = _my__property; 
     c.SomeMethod(i) // this works 
    } 
} 
+0

在此期間,我發現我可以使用C++風格的指針,這些指針不受管理,這對我來說已經足夠了。 'int * _my_property' – sekmet64 2011-05-21 12:15:50

回答

4

C++引用實際上只是指針的語法建議。 C++指針指向內存中的特定點,而CLI引用可以由垃圾收集器自由移動。要將託管內存中的對象的引用傳遞給unmanged代碼,您需要引腳指針。

更多信息和樣本在另一個SO問題:Convert from C++/CLI pointer to native C++ pointer

編輯2

我刪除的附加信息,因爲這顯然是錯誤的(感謝@Tergiver和@DeadMG您的意見) 。我也在製作發佈社區wiki,所以請隨時添加任何額外的正確信息。

+2

您是正確的,託管引用必須被固定,然後才能將其交給非託管代碼。但是可以固定的東西與堆棧無關。只有「blittable」對象可以被固定。 blittable對象本質上是一個值類型或值類型數組。我不清楚所有的「易逝性規則」。 – Tergiver 2011-05-21 14:05:32

+0

你可以固定「這個」。 – Puppy 2011-05-21 14:27:38

+0

@Tergiver和@DeadMG感謝您的評論,我已更新我的帖子。 – 2011-05-21 14:31:06

相關問題