编译C#不安全代码

时间:2013-09-24 15:48:40

标签: c# .net compiler-construction unsafe

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

正如您所说,您最好的选择是尽可能将不安全的代码隔离到自己独立的程序集中。由于一个不安全的类,装配体中只有一个类的事实远不如污染整个装配充满安全代码的装配。

答案 1 :(得分:4)

C#有一个unsafe关键字,你必须在不安全的代码周围使用,只是为了避免人们偶然使用不安全的代码。这是我能想到的最佳方法:如果有人可以在文件中引入unsafe关键字,他们可以轻松添加或删除#pragma标记或其他类似标记。

/unsafe编译器标记告诉编译器你对这个程序集中使用unsafe关键字的人没问题,并且你认识到它生成的程序集将标记为“不安全”,这可能是防止它在不完全信任的环境中运行。没有办法让编译器只将单个类标记为不安全:人们可以信任你的程序集,也可以不信任。