2013-07-13 37 views
2

這可能是一個明顯的問題,但我一直在Google上搜索2個小時,但無法弄清楚。所以,我有在C++中,看起來像這樣一類:如何通過引用將C++中的float引用傳遞迴C#?

class MyClass 
{ 
public: 
    static void Function(float& r) { r = 10; } 
}; 

我有一個互操作包裝類,如下所示:

public ref class Wrapper 
{ 
public: 
    static void WrappedFunction(float& r) { MyClass::Function(r); } 
}; 

現在我想從C#調用它,就像這樣的:

float r; 
Wrapper.WrappedFunction(ref r); 

但是我得到C#的一側說,這編譯錯誤:

cannot convert from 'ref float' to 'float*' 

我有一個含糊的想法,我需要在包裝類中做些事情,但我不知道是什麼。另外,我知道這個用例對於dllimport/pinvoke來說是微不足道的,但是我想用C++/CLI來包裝這些用於性能方面的原因。

任何幫助,非常感謝!

+0

嘗試從浮動&浮動*更改。而C++函數必須寫成「static void Function([out] float * r)」。哦,而且無處不在。 –

+0

語法錯誤,請使用float%指定託管引用而不是非託管&。 –

+0

@nsinreal:在開始提供信息而不先測試它之前,您可能需要更多的C++/CLI經驗。 –

回答

2

包裝類需要與%工作定義幾乎完全一樣使用&上定義的

public ref class Wrapper 
{ 
public: 
    static void WrappedFunction(float% r) 
    { float copy = r; MyClass::Function(copy); r = copy; } 
}; 

引用,除非他們與垃圾回收器一起工作。

另一種選擇是

public ref class Wrapper 
{ 
public: 
    static void WrappedFunction(float% r) 
    { pin_ptr<float> p = &r; MyClass::Function(*p); } 
}; 

這將針防止垃圾收集器使用它在存儲器中的對象,而是直接對管理可變本機代碼的工作。通常不重要,但如果你有另一個線程需要查看中間值,這是如何。

+0

謝謝,修正了編譯錯誤! – Peter