我正在使用C ++ / CLI 库来与C#一起使用。我有一个ref类(直接在托管代码中使用,因此它必须兼容)存储HWND
,但我不认为我做得对:
public ref class MyClass {
protected:
HWND hWnd;
}
我应该在ref类中使用像这样的本机指针吗?或者我应该使用ptr<T>
?
答案 0 :(得分:2)
句柄不是指针,HWND很好。如果您希望C#代码从您的类派生并访问句柄,那么您需要将其公开为IntPtr
。与句柄兼容,在32位模式下为4字节,在64位模式下为8字节,就像句柄一样。
最好用一个属性来包装它以隐藏转换:
protected:
property IntPtr Handle {
IntPtr get() { return IntPtr(hwnd); }
void set(IntPtr h) { hwnd = (HWND)h.ToPointer(); }
}
private:
HWND hWnd;
SafeHandle 可能有用,但HWND的生命周期通常不在您的控制之下。
答案 1 :(得分:1)
本机指针/句柄在ref类中是完全安全的。 (毕竟,他们只是int
。)然而,将它们存储在IntPtr
类中更为惯用。 (这就是WinForms stores them的方式。)