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#编译器会将引用编译器设置为可重定向。 我没有找到编译器如何决定使程序集可重定向。