2014-09-29 45 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; 
}; 

不知道为什么这个工程和其他没有。