我有一个采用IntPtr的外部库。有没有安全的方法可以做到这一点...
int BytesWritten = 0;
Output.WriteBytes(buffer, new IntPtr(&BytesWritten));
Run Code Online (Sandbox Code Playgroud)
...而不必使用“不安全”代码?我对IntPtrs不太熟悉,但是我想做这样的事情:
fixed int BytesWritten = 0;
Output.WriteBytes(buffer, IntPtr.GetSafeIntPtr(ref BytesWritten));
Run Code Online (Sandbox Code Playgroud)
...以这种方式,我不需要使用/ unsafe进行编译。
我不能更改WriteBytes函数,它是一个外部函数。
似乎在'ref int'和IntPtr之间应该进行某种类型的转换,但是我还没有找到它的运气。
就在这里。您可以将 P/Invoke 用于您的代码。它会自动为您创建指针。像这样的东西:
[DllImport("yourlib", SetLastError=true)]
static extern bool WriteBytes(
[MarshalAs(UnmanagedType.LPArray)]
byte [] buffer,
ref int BytesWritten);
Run Code Online (Sandbox Code Playgroud)
(我添加了数组作为奖励)。有关 P/Invoke 的更多信息,以及大量示例,请访问pinvoke.net。
上面的每个参数都可以采用out,in和ref。Out 和 ref 参数被转换为指针,其中 ref 参数是双向的。