.NET Compact Framework引入了可重定向的程序集引用,现在用于支持可移植类库。
基本上,编译器会发出以下MSIL:
.assembly extern retargetable mscorlib
{
.publickeytoken = (7C EC 85 D7 BE A7 79 8E )
.ver 2:0:5:0
}
C#编译器如何理解它必须发出一个可重定向的引用,以及如何强制C#编译器甚至在可移植类库之外发出这样的引用?
答案 0 :(得分:3)
对于程序集本身,它是一个程序集标志,即[assembly:AssemblyFlags(AssemblyNameFlags.Retargetable)]。
请注意,此标志在平台程序集之外没有意义 - 自定义程序集无法重新定位。
对于引用,它被复制为被引用的程序集中名称的一部分。
答案 1 :(得分:2)
不确定这是否有帮助,但以下文件是自动生成的并包含在构建中。
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”
答案 2 :(得分:0)
通过实验证明,如果引用的程序集被标记为可重定向(CIL中.assembly
部分的修饰符),C#编译器会将引用编译器设置为可重定向。我没有找到编译器如何决定使程序集重新定位,但是。