我需要添加和/或修改配置文件,以允许在PCL中共享更多类和成员(其中许多是框架内置的,例如Thread.Sleep)。最佳方法是什么?是否有任何工具可帮助完成此操作?
PS:我不想要NO或STOP的答案。我想拥有可以在不同环境中共享的编译一次的DLL。没有每个平台的二进制文件,没有重新编译,也没有ifdef。
以下是我目前所得到的:
PS:我不想要NO或STOP的答案。我想拥有可以在不同环境中共享的编译一次的DLL。没有每个平台的二进制文件,没有重新编译,也没有ifdef。
以下是我目前所得到的:
需求:
- 目标环境:Silverlight 5和.NET Framework 4.5。
- PCL的目的:RIA客户端和ASP.NET服务器之间的共享基础设施(没有WCF)
- 默认配置文件中缺少的内容:XPath、线程方法、DynamicMethod/ILGenerator
PCL配置文件:在Reference Assemblies\Microsoft\Framework.NETPortable下:
- 所有程序集都是存根,并设置了“Retargetable”属性。
- 所有程序集的标志均为0x171:0x001已签名,0x100可重定向,0x070在AssemblyNameFlags中未定义(似乎没有影响)
- 所有程序集之间的引用也具有“Retargetable”属性。
- 支持Silverlight的所有程序集的版本均为2.0.5.0。
- 构建的PCL二进制文件包含每个被引用程序集的两个引用(例如mscorlib 2.0.5.0可重定向+mscorlib 4.0)
自定义尝试#1
- 配置文件:Silverlight 5 + .NET Framework 4.5(配置文件24)
- 将SL5 mscorlib.dll复制到配置文件24中
- 将SL5 mscorlib.dll标记为可重定向(更改为延迟签名)
- ReSharper:无法解析所有扩展方法,泛型类型/值匹配出错
- 构建:成功,运行:成功
自定义尝试#2
- 配置文件:Silverlight 5 + .NET Framework 4.5(配置文件24)
- 将所有SL5 DLL复制到配置文件24中
- 将所有SL5 DLL标记为可重定向(更改为延迟签名)
- 将所有SL5 DLL之间的引用标记为可重定向
- ReSharper:无法解析所有扩展方法,泛型类型/值匹配出错
- 构建:成功,运行:成功
自定义尝试#3
- 概要: Silverlight 4 + .NET Framework 4.0.3 (18号配置文件)
- 将SL4 mscorlib.dll复制到18号配置文件中
- 将SL4 mscorlib.dll标记为可重新定位(更改为延迟签名)
- ReSharper:成功
- 构建:成功,运行:成功
自定义尝试#4
- 概要: Silverlight 4 + .NET Framework 4.0.3 (18号配置文件)
- 将所有SL4 DLL复制到18号配置文件中
- 将所有SL4 DLL的.NET运行时版本设置为v4(原始DLL已有,未知效果)
- 将所有SL4 DLL标记为可重新定位(更改为延迟签名)
- 将所有SL4 DLL之间的引用标记为可重新定位
- ReSharper:成功
- 构建:成功,运行:成功
自定义尝试#5 继承#4
- 概要: Silverlight 4 + .NET Framework 4.0.3 (18号配置文件)
- 将SL4的System.Numerics(包含在其他SL配置文件中)添加到RedistList\FrameworkList.xml中
- 将SL4的System.Xml.XPath(不包含在任何SL配置文件中)添加到RedistList\FrameworkList.xml中
- 结果: 无法从默认PCL引用中解析System.Numerics和System.Xml.XPath
- 修复方法: 手动引用两个DLL - 无法强制它们可重新定位,但VS不会编译具有不可重新定位的System.Numerics或System.Xml.XPath的代码,由于下面所述的问题。
注:
- 编译错误:“...定义在未被引用的程序集中,您必须添加对程序集的引用”。在所有程序集都变成可重新定位之后,如果其中一个引用没有改为“可重新定位”,则会发生此错误。
这在一定程度上有效,但是定制现有引用的DLL或添加新的DLL相当麻烦,而且很难在覆盖引用的DLL后轻松验证PCL代码(如果可能的话)。