4

我有一个带有一些不安全方法的小型 C# 类。有没有办法在 C# 源代码中以声明方式指定“/unsafe”选项(使用#pragma或以其他方式)仅用于类源文件的上下文?我不想为这样一个小类创建一个单独的程序集,但我也真的不希望为不安全代码启用程序集的其余部分(该类当前是其中的一部分)。

4

2 回答 2

7

不,这是(目前)不可能的,因为整个程序集会受到其中不安全代码的影响。

通过在程序集中包含不安全代码,您是在告诉 CLR 程序集可以做一些不安全的事情,这会改变运行时在加载程序集时的行为方式。这里最大的变化是 CLR 根本不会尝试验证您的不安全代码,但它也会拒绝加载您的程序集,除非它具有完全信任(例如,您无法以普通用户的身份通过点击加载不安全的程序集-一次。)

从技术角度来看,当您使用该/unsafe选项时,它会导致编译器将以下模块级属性的 IL 等效项发送到您的程序集中:

[assembly:SecurityPermission(SkipVerification = true)]
[assembly:UnverifiableCode]

正如您所说,您最好的选择是尽可能将不安全的代码隔离到自己的单独程序集中。与由于一个不安全的类而污染整个充满安全代码的程序集相比,程序集只有一个类这一事实要少得多。

于 2013-09-24T15:53:59.687 回答
5

C# 有一个unsafe关键字,您必须在不安全代码周围使用它,以避免人们意外使用不安全代码。这是我能想到的任何一种方法:如果有人可以unsafe在文件中引入关键字,他们可以很容易地添加或删除#pragma标签或类似的东西。

编译器/unsafe标签告诉编译器你可以接受unsafe在这个程序集中使用关键字的人,并且你认识到它生成的程序集将被标记为“不安全”,这可能会阻止它在低于完全信任的环境中运行. 没有办法让编译器仅将单个类标记为不安全:人们可以信任您的程序集,也可以不信任。

于 2013-09-24T15:52:41.437 回答