【问题标题】:How to cast IntPtr to byte*如何将 IntPtr 转换为字节 *
【发布时间】:2009-04-03 10:05:06
【问题描述】:

我正在通过互操作调用一个返回out IntPtr 参数的方法。我怎样才能为这个IntPtr 获得一个byte* 以便我可以对其进行操作?我尝试了以下方法:

fixed(byte* ptr = (byte)myIntPtr)

但它没有用。任何帮助将不胜感激!

【问题讨论】:

  • 您好,Dmitri,您可以要求提供更多信息或接受答案吗?

标签: c#


【解决方案1】:

你可以简单地写:

byte* ptr = (byte*)int_ptr;

您不必使用 fixed 关键字。您不想固定 IntPtr,是吗?

【讨论】:

  • 这也很好用,虽然我个人喜欢 ToPointer 方法,特别是如果您不需要立即将其转换为特定类型的指针(例如从 void* 到 byte*)。
【解决方案2】:

myIntPtr.ToPointer()

【讨论】:

  • 请注意,fixed 关键字在这种情况下并不合适,因为它用于防止变量的重定位。由于 IntPtr 已经是一个(托管)指针,因此您基本上只需要在两种类型之间进行直接转换。另见msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspx
  • IntPtr 在这种情况下不是托管指针,而是非托管指针!
  • 是的,我真正的意思是 IntPtr 是托管指针,因为它是托管库的一部分,而 byte* 是不安全的 C 样式指针。或许“安全”会是一个更好的词,但重要的是要注意 IntPtr 和 SafeHandle 之间的区别。
  • IntPtr 也不是很安全,因为您可以将其转换为整数。无论如何,有大量的遗留 API 可供使用,因此 IntPtr 不会很快消失。
  • 嗯,是的,它是 Win32 互操作编程的基础。我认为我指出 IntPtr 不是很安全(取决于您使用的词的含义)-但至少它不需要像指针那样不安全的上下文。
【解决方案3】:

我不想在我的应用程序中出现“不安全代码”,因此我执行以下操作将 IntPtr 转换为 byte[]。给定一个名为“unsafeDataBlock”的 IntPtr:

var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(unsafeDataBlock, byteArray, 0, dataBlockSize);

【讨论】:

    【解决方案4】:

    这似乎对我有用,我没有使用 Interop,但仍在从 C Sharp 调用托管 C++ 函数。然而,托管 C++ 函数称为非托管代码,因此它完成了与 Interop 相同的事情。

    无论如何,在从 c-sharp 调用的 C++ 函数中,我使用了以下代码:

    (anyPointerType*) pointer = (anyPointertype*) myIntPtr.ToPointer();
    

    【讨论】:

    • 只是为了澄清我的意思:“我没有使用 Interop,但仍在从 C Sharp 调用托管 C++ 函数。托管 C++ 函数调用了非托管代码,因此它完成了与Interop." 通过 Interop 调用非托管代码:C-Sharp -(使用互操作调用)> 非托管代码与从 c-sharp 调用调用非托管代码的托管 c++ 函数具有相同的结果:C-Sharp -(Calls)> 托管 C++ function -(Calls)> 非托管代码,后一个过程通常更容易
    【解决方案5】:

    如果您不想在应用程序中使用不安全代码,则必须使用 System.Runtime.InteropServices.Marshal 中的方法,或者(甚至更好)声明互操作函数的参数类型,以便自动进行封送处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 2013-08-12
      • 2010-09-07
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2010-10-23
      相关资源
      最近更新 更多