5

在 .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);

或更明确地(这是默认编组):

[DllImport("native.dll")]
static extern void foo([MarshalAs(UnmanagedType.LPArray)] double[] samples);
4

1 回答 1

1

从托管代码调用 ap/invoke 要求您的代码在完全信任的情况下执行(我认为在 v4 之前它需要 UnmanagedCode 权限,这是一个完全信任等效的权限),因为调用本机代码可能很危险,因此对于正在运行的代码是不可能的在 CLR 不信任 p/invoke 的模式下运行。

标记为不安全的代码也只会在代码受信任的情况下运行。不过,这意味着一些非常具体的东西,并且与通过 ap/invoke 调用本机代码不同。被标记为“不安全”意味着代码本身是无法验证的。也就是说,代码本身可能正在做危险的、非类型安全的事情。

因此,它们只是 .Net 程序可能具有潜在危险的两种不同方式。unsafe 关键字并不意味着任何潜在不安全操作的总体类别,仅与托管代码是否可验证相关的那些(它没有说明“可验证”代码是否可能启动新进程,或修改重要的系统文件或 ACL - 也是需要完全信任的危险事情)。

更多“不安全”的详细信息:http: //msdn.microsoft.com/en-us/library/t2yzs44b.aspx

于 2014-08-26T03:35:13.800 回答