IntPtr并避免使用不安全的代码

Ari*_*yck 5 .net c# intptr

我有一个采用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之间应该进行某种类型的转换,但是我还没有找到它的运气。

Abe*_*bel 2

就在这里。您可以将 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,inref。Out 和 ref 参数被转换为指针,其中 ref 参数是双向的。