在 .NET 中使用指针时 [unsafe]
属性代码必须使用 /unsafe
标记为不安全csc
中的选项例如。
但是当我使用 PInvoke 时会发生什么,对我来说似乎编译的程序集将被视为安全托管代码,而它可能包含潜在的安全问题,对吗?
注意:这既坏又好,因为这是一种使用快速指针操作而无需将程序集标记为 /unsafe
的方法。 .
例如
extern "C" __declspec(dllexport) void foo(double* samples)
{
*samples = 42.0;
}
调用者:
[DllImport("native.dll")]
static extern void foo(double[] samples);
或者更明确地(这是默认的编码(marshal)处理):
[DllImport("native.dll")]
static extern void foo([MarshalAs(UnmanagedType.LPArray)] double[] samples);
最佳答案
从托管代码调用 ap/invoke 要求您的代码在完全信任的情况下执行(我认为在 v4 之前它需要 UnmanagedCode 权限,这是一个完全信任的等效项),因为调用 native 代码可能很危险,因此对于正在运行的代码是不可能的在 CLR 不信任 p/invoke 的模式下运行。
标记为不安全的代码也只会在代码受信任时运行。不过,这意味着一些非常具体的事情,并且与通过 p/invoke 调用 native 代码不同。被标记为“不安全”意味着代码本身是无法验证的。也就是说,代码本身可能正在做危险的、非类型安全的事情。
因此,它们只是 .Net 程序可能具有潜在危险的两种不同方式。 unsafe 关键字并不意味着是任何潜在不安全操作的整体类别,只是那些与托管代码是否可验证有关的操作(它没有说明“可验证”代码是否可能启动新进程,或修改重要的系统文件或 ACL - 也是需要完全信任的危险事物)。
更多“不安全”的细节在这里:http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx
关于.net - 使用 pinvoke 是否将 .NET 标记为不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19174829/