【发布时间】:2009-04-03 10:05:06
【问题描述】:
我正在通过互操作调用一个返回out IntPtr 参数的方法。我怎样才能为这个IntPtr 获得一个byte* 以便我可以对其进行操作?我尝试了以下方法:
fixed(byte* ptr = (byte)myIntPtr)
但它没有用。任何帮助将不胜感激!
【问题讨论】:
-
您好,Dmitri,您可以要求提供更多信息或接受答案吗?
标签: c#
我正在通过互操作调用一个返回out IntPtr 参数的方法。我怎样才能为这个IntPtr 获得一个byte* 以便我可以对其进行操作?我尝试了以下方法:
fixed(byte* ptr = (byte)myIntPtr)
但它没有用。任何帮助将不胜感激!
【问题讨论】:
标签: c#
你可以简单地写:
byte* ptr = (byte*)int_ptr;
您不必使用 fixed 关键字。您不想固定 IntPtr,是吗?
【讨论】:
myIntPtr.ToPointer()
【讨论】:
我不想在我的应用程序中出现“不安全代码”,因此我执行以下操作将 IntPtr 转换为 byte[]。给定一个名为“unsafeDataBlock”的 IntPtr:
var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(unsafeDataBlock, byteArray, 0, dataBlockSize);
【讨论】:
这似乎对我有用,我没有使用 Interop,但仍在从 C Sharp 调用托管 C++ 函数。然而,托管 C++ 函数称为非托管代码,因此它完成了与 Interop 相同的事情。
无论如何,在从 c-sharp 调用的 C++ 函数中,我使用了以下代码:
(anyPointerType*) pointer = (anyPointertype*) myIntPtr.ToPointer();
【讨论】:
如果您不想在应用程序中使用不安全代码,则必须使用 System.Runtime.InteropServices.Marshal 中的方法,或者(甚至更好)声明互操作函数的参数类型,以便自动进行封送处理。
【讨论】: