Cit*_*ane 5 .net pinvoke unsafe
在.NET中使用带有[unsafe]属性的指针时,必须使用/unsafe选项将代码标记为不安全csc.
但是当我使用PInvoke时会发生什么,对我而言,编译程序集似乎都被认为是安全的托管代码,而它可能包含潜在的安全问题,对吧?
注意:这既糟糕又好,因为它是一种使用快速指针操作而不必将程序集标记为的方法/unsafe.
例如
extern "C" __declspec(dllexport) void foo(double* samples)
{
*samples = 42.0;
}
Run Code Online (Sandbox Code Playgroud)
被称为:
[DllImport("native.dll")]
static extern void foo(double[] samples);
Run Code Online (Sandbox Code Playgroud)
或者更明确地(这是默认的编组):
[DllImport("native.dll")]
static extern void foo([MarshalAs(UnmanagedType.LPArray)] double[] samples);
Run Code Online (Sandbox Code Playgroud)
小智 1
从托管代码调用 ap/invoke 要求您的代码以完全信任的方式执行(我认为在 v4 之前,它需要 UnmanagedCode 权限,这是完全信任的等效项),因为调用本机代码可能很危险,因此不可能执行正在运行的代码以 CLR 不信任 p/invoke 的模式运行。
标记为不安全的代码也只有在受信任的情况下才会运行。不过,它的含义非常具体,并且与通过 ap/invoke 调用本机代码不同。被标记为“不安全”意味着代码本身无法验证。也就是说,代码本身可能在做危险的、非类型安全的事情。
因此,它们只是 .Net 程序可能产生潜在危险的两种不同方式。unsafe 关键字并不意味着成为任何潜在不安全操作的总体类别,只是那些与托管代码是否可验证具体相关的操作(它没有说明“可验证”代码是否可能启动新进程,或修改重要的系统文件或 ACL - 也是需要完全信任的危险事情)。
更多“不安全”详细信息:http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |