C# 如何将IntPtr强制转换为字节*

C# 如何将IntPtr强制转换为字节*,c#,C#,我正在通过interop调用一个方法,该方法返回一个out IntPtr参数。如何获取此IntPtr的字节*,以便对其进行操作?我尝试了以下方法: fixed(byte* ptr = (byte)myIntPtr) 但它不起作用。任何帮助都将不胜感激 myIntPtr.ToPointer()您只需编写: byte* ptr = (byte*)int_ptr; 您不必使用fixed关键字。您不想锁定IntPtr,是吗?如果您不想在应用程序中使用不安全的代码,您必须使用System.Runtim

我正在通过interop调用一个方法,该方法返回一个
out IntPtr
参数。如何获取此
IntPtr
字节*
,以便对其进行操作?我尝试了以下方法:

fixed(byte* ptr = (byte)myIntPtr)
但它不起作用。任何帮助都将不胜感激

myIntPtr.ToPointer()
您只需编写:

byte* ptr = (byte*)int_ptr;

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

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

我不想在应用程序中使用“不安全的代码”,因此,我做了以下操作,将IntPtr转换为字节[]。给定一个名为“unsafeDataBlock”的IntPtr:


<>这似乎对我有用,我不是使用互操作,但仍然调用C Sharp的托管C++函数。然而,托管C++函数称为非托管代码,因此它实现了与互操作。

无论如何,在从C-Spice调用的C++函数中,我使用了这个代码:

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

注意,在这种情况下,fixed关键字并不合适,因为它用于防止变量的重新定位。由于IntPtr已经是一个(托管)指针,因此本质上您只需要在这两种类型之间进行直接转换。另请参见本例中的IntPtr不是托管指针,而是非托管指针!是的,我真正的意思是IntPtr是一个托管指针,因为它是托管库的一部分,而byte*是一个不安全的C风格指针。也许“safe”是一个更好的词,不过注意IntPtr和SafeHandle之间的区别很重要。IntPtr也不是很安全,因为您可以将其从/转换为整数。无论如何,有很多遗留API可供使用,因此IntPtr不会很快消失。是的,它是Win32互操作编程的基础。我想我已经指出,IntPtr不是很安全(取决于您使用的单词的含义),但至少它不像指针那样需要不安全的上下文。这也很好,尽管我个人喜欢ToPointer方法,特别是如果您不需要立即将其转换为特定类型的指针(例如从void*到byte*)为了澄清我的意思:“我不是使用互操作,而是仍然调用C Scice调用的托管C++函数。但是,托管C++函数称为非托管代码,因此它完成了与互操作相同的事情。”通过互操作调用非托管代码:C-Spice(使用互操作调用)。>非托管代码与调用C++非托管代码的C +函数调用的结果相同:C-Spice(Cube)>托管C++函数(调用)>非托管代码,后者的过程通常是EasieHi德米特里,您可以请求更多信息,或接受答案吗?
(anyPointerType*) pointer = (anyPointertype*) myIntPtr.ToPointer();