2014-09-29 44 views
1

我想在C++/cli中包裝一個C++類,該類的一個框架如下。包裝一個C++函數,採用int *在C++/cli

public class UnmanagedClass{ 
    //... 
    // This function stores the size in the x and y values 
    int GetSize(int* x, int* y); 
}; 

我希望做一個管理類,包裝這個類,所以我嘗試了以下內容:

public ref class ManagedCode{ 
    UnmanagedClass* _pUnamangedClass; 
    //... 

    int GetSize(int% x, int% y){ 
     return _pUnmanagedClass->GetSize(&x,&y) 
     // Also Tried 
     // return _pUnmanaged->GetSize(x,y) 
    }; 
}; 

我得到一個錯誤:「internal_ptr與參數類型不兼容‘INT *’」

return _pUnmanagedClass->GetSize(&x, &y) 

任何想法,我哪裏去錯了。

回答

2

傳遞的x和y參數可能是被管理對象的成員。當垃圾收集器在本機代碼運行時移動該對象然後發生災難時,本機代碼會破壞GC堆。編譯器檢測到並且不允許代碼。

您必須爲本地代碼提供穩定的地址。像函數的局部變量一樣,存儲在堆棧幀中。不漂亮,但它解決了這個問題:

int GetSize(int% x, int% y){ 
     int xcopy = x; 
     int ycopy = y; 
     int retval = _pUnmanagedClass->GetSize(&xcopy, &ycopy); 
     x = xcopy; 
     y = ycopy; 
     return retval; 
    } 

或者使這個樣子的.NET代碼,任何C#程序員知道如何使用,我在返回值的意圖猜測:

Size GetSize() { 
     int w, h; 
     if (_pUnmanagedClass->GetSize(&w, &h) != 0) throw gcnew MyInteropException; 
     return Size(w, h); 
    } 
+0

我發現了相同的答案,並在你之前發佈了它,但是你的解釋是垃圾收集器可能想要移動int%值,這有助於我理解語法爲何如此醜陋。謝謝! – 2014-09-29 20:49:41

0

我已經找到了解決辦法:

int GetSize(int% x, int% y){ 
    int xVal = x; 
    int yVal = y; 

    int result = _pUnmanagedClass->GetSize(&xVal, &yVal); 

    x = xVal; 
    y = yVal; 

    return result; 
}; 

不知道爲什麼這個工程和其他沒有。