12

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

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

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

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

4

3 回答 3

3

对于程序集本身,它是一个程序集标志,即[程序集:AssemblyFlags(AssemblyNameFlags.Retargetable)]。

请注意,此标志在平台程序集之外没有意义 - 自定义程序集不能重新定位。

对于引用,它作为名称的一部分从被引用的程序集中复制。

于 2012-07-11T04:17:44.450 回答
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”

于 2012-07-10T07:55:10.577 回答
0

我通过实验注意到,如果引用的程序集被标记为可重定向(.assemblyMSIL 中的部分上的修饰符),C# 编译器将使引用编译器成为可重定向的。我还没有发现编译器如何决定使程序集可重定向。

于 2012-07-10T11:00:18.070 回答