C#编译器如何决定发出可重定向的程序集引用?
.NET Compact Framework引入了可重定向的程序集引用,现在用于支持可移植类库。
基本上,编译器会发出以下MSIL:
.assembly extern retargetable mscorlib { .publickeytoken = (7C EC 85 D7 BE A7 79 8E ) .ver 2:0:5:0 }
C#编译器如何理解它必须发出一个可重定向的引用,以及如何强制C#编译器甚至在可移植类库之外发出这样的引用?
对于程序集本身,它是一个程序集标志,即[assembly:AssemblyFlags(AssemblyNameFlags.Retargetable)]。
请注意,此标志在平台程序集之外没有意义 – 自定义程序集无法重定向。
对于引用,它被复制为正在引用的程序集的名称的一部分。
不确定这是否有帮助,但以下文件是自动生成的并包含在构建中。
using System; using System.Reflection; [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute( ".NETPortable,Version=v4.0,Profile=Profile4", FrameworkDisplayName = ".NET Portable Subset")]
这可能暗示编译器要做一些魔术。
编辑:
我认为上面使一个库可移植。 从命令行我可以看到/nostdlib+
被使用,并且引用了一个可移植的mscorlib.dll
(我假设它具有与上面提到的相同的属性)。
“… \ Program Files \ Reference Assemblies \ Microsoft \ Framework.NETPortable \ v4.0 \ Profile \ Profile4 \ mscorlib.dll”
我通过实验注意到,如果引用的程序集被标记为可重定向(CIL中的.assembly
部分的修饰符),C#编译器会将引用编译器设置为可重定向。 我没有找到编译器如何决定使程序集可重定向。