我需要添加和/或修改配置文件以允许在 PCL 中共享更多类和成员(其中许多是内置在框架中的,例如 Thread.Sleep)。最好的方法是什么?有什么工具可以帮助做到这一点吗?
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下:
- 所有程序集都是存根,具有“可重定向”属性集。
- 所有程序集都有标志 = 0x171:0x001 已签名,0x100 可重定向,0x070 在 AssemblyNameFlags 中未定义(似乎没有效果)
- 程序集之间的所有引用也具有“可重定向”属性。
- 支持 Silverlight 的所有程序集的版本均为 2.0.5.0。
- 构建的 PCL 二进制文件包含每个引用程序集的两个引用(例如:mscorlib 2.0.5.0 retargetable + 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 代码。