2012-07-10 52 views
12

为.NET Compact Framework引入了可重定向汇编引用,现在用于支持可移植类库。C#编译器如何决定发出可重定向的程序集引用?

基本上,编译器生成以下MSIL:

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

如何C#编译器了解它必须发出一个重定目标的引用,以及如何强制C#编译器外连的便携式的发射这样的参考类库?

+0

MSBuild目标文件没有提示?我想知道你需要从命令行传递给编译器。 – leppie 2012-07-10 07:49:05

回答

2

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

请注意,此标志在平台组件外是没有意义的 - 自定义程序集不能重定向。

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

+0

谢谢。这是我正在寻找的。我希望摆脱消息'无法加载文件或程序集'PostSharp,版本= 3.0.0.0,文化=中立,PublicKeyToken = 53d2effcf2ee70dc,Retargetable =是'或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040)'提供(通过IHostAssemblyStore)另一个程序集而不是CLR请求的程序集,但即使使用可重定目标引用,仍然会出现错误。有没有解决这个问题的方法? – 2012-07-11 05:55:00

+0

可重定向不会让你键跳用户程序集,就像我假设你正在尝试。这完全是CLR内部的目的。我不是托管API的专家,但我认为LoadFile可能允许您这样做。 – 2012-07-11 08:15:11

+0

谢谢。我会尝试另一种解决方案:相同的短名称,相同的强名键,但不同的版本号。正常的绑定策略应该可以做到。 – 2012-07-11 12:07:33

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文件\参考大会\微软\ Framework.NETPortable \ V4.0 \资料\ Profile4 \ mscorlib.dll中”

+1

'TargetFrameworkAttribute'也存在于v4版本的Client和Full Framework版本中,它不适用于v3.5版本。这可能是他们添加属性的原因。从第4版开始,它还提供了一种非常简单的方法来确定程序集是为完整框架还是客户端配置文件构建的。 – 2012-07-10 08:05:51

+0

@AdamHouldsworth:谢谢,我想现在已经过时了,因为客户端配置文件已经在4.5了? ; p – leppie 2012-07-10 08:07:53

+0

即使在.NET 4中,客户端配置文件和完全下载之间的区别也是几MB,不值得 - 可能为什么他们将它改为PCL。 – 2012-07-10 08:08:44

0

我已经通过实验,在C#编译器会做出注意到如果引用程序集标记为可重定向(MSIL中.assembly部分的修饰符),则可将参考编译器设置为可重定向。我没有找到编译器决定如何使程序集可重定向。

相关问题