C#编译器如何决定发出可重定向的程序集引用?

时间:2012-07-10 07:47:02

标签: c# compiler-construction portable-class-library

.NET Compact Framework引入了可重定向的程序集引用,现在用于支持可移植类库。

基本上,编译器会发出以下MSIL:

.assembly extern retargetable mscorlib
{
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E )                         
    .ver 2:0:5:0
}

C#编译器如何理解它必须发出一个可重定向的引用,以及如何强制C#编译器甚至在可移植类库之外发出这样的引用?

3 个答案:

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