PCL在MonoTouch和MonoDroid中运行良好。
但是,有时,当我使用变量引用PCL中的Type,然后我尝试在MonoX客户端中使用相同的引用时,编译器会失败,并显示如下消息:
类型'System.Collections.Specialized.INotifyCollectionChanged'在未引用的程序集中定义。您必须添加对程序集'System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e,Retargetable = Yes'的引用。
这里的问题是在MonoDroid中我的System.Collections.Specialized.INotifyCollectionChanged
PCL是在垫片类型转发DLL中提供的 - 比如https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/System.Windows - 很明显,DLL不能使用Microsoft的私钥进行签名。
更多信息:
有人能建议任何解决方法吗?例如有没有办法关闭强大的装配命名保护?
我认为如果要在微软出货的.Net实施之外真正实现PCL,我们需要这样做吗?
答案 0 :(得分:2)
在管理员VS命令提示符下,您可以运行此命令:
sn -Vr *,7cec85d7bea7798e
对于使用7cec85d7bea7798e作为公钥令牌的任何程序集,这将跳过强名称验证。然后你应该能够延迟用该密钥签署你的填充程序DLL。我认为您可以使用sn -pc
从DLL中提取密钥的公共部分,以便将其用于延迟签名。
这应该允许您使用填充程序进行编译。当然,它还需要在运行时工作。我认为MonoTouch和MonoDroid实际上并没有验证程序集的强名称密钥,因此它只会起作用。如果他们确实做了这个验证,那么我认为你无能为力。在这种情况下,Mono需要进行一些更改以支持这些类型引用或忽略填充程序的密钥,或者Microsoft需要提供可以使用的填充DLL的签名版本。
请注意,我不是安全专家,因此我不知道在您的计算机上禁用这些Microsoft密钥可能具有哪种安全影响。我不认为会有任何重大影响...
Daniel的详细跟进:
我认为您需要做的就是在Mono上解决便携式库的类型共享/强名称签名问题:
- >解压缩System.Windows.dll的公钥,并将其放在Droid System.Windows项目的项目目录中:
Sn –e "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile104\System.Windows.dll" system_windows.snk
- >使用提取的密钥修改Droid system.windows项目以进行延迟签名。将以下内容放在csproj文件中的PropertyGroup中:
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>system_windows.snk</AssemblyOriginatorKeyFile>
<DelaySign>true</DelaySign>
- &GT;将Droid System.Windows项目的程序集版本(在AssemblyInfo.cs中)更改为:
2.0.5.0
在我的测试中,我似乎不需要禁用强名称验证。所以我认为它不会给新手带来任何额外的障碍 - 一旦你做了这些改变,他们只需要获得你的代码,它就会正确构建。
但是,如果遇到问题,请尝试从管理VS命令提示符运行以下命令:
sn -Vr *,7cec85d7bea7798e
让我知道这是如何运作的!
谢谢,
丹尼尔
答案 1 :(得分:-1)
我的项目中有类似的问题,我有.Net 4.5,Windows Phone 8,WinRT,MonoTouch和MonoDroid的PCL,当我尝试构建MonoDroid或MonoTouch时,项目错误如下:
*错误1类型'System.Object'在未引用的程序集中定义。您必须添加对程序集'System.Runtime的引用, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。
错误2类型'System.Enum'是在没有的程序集中定义的 引用。您必须添加对程序集'System.Runtime的引用, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。
我已经完成了建议命令(sn -Vr *,b03f5f7f11d50a3a),但它没有帮助。 我使用以下个人资料:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile78