.net - 使用 pinvoke 是否将 .NET 标记为不安全?

标签 .net pinvoke unsafe

在 .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/

相关文章:

c# - 在 pInvoke 中编码结构数组

c# - Windows Phone 8(WP8) C# 不安全代码?

c# - 使用表达式树调用不安全方法

c# - 如何将 WAVE_MAPPER 音频线与其音频设备关联

c# - 了解使用固定{}、Marshal.AllocHGlobal() 和 GCHandle.Alloc() 之间的区别

c# - 用于查找 .NET 中特定程序集使用的所有方法和类的工具?

.net - 有什么方法可以使 DataContractJsonSerializer 正确序列化字典吗?

c# - 'fixed' : working on memory location or object? 的内部工作

c# - .NET 正则表达式整个字符串匹配

.net - jquery 类似 c#/.Net 中的扩展