MonoTouch / MonoDroid中的可移植类库强大的程序集引用问题

时间:2012-10-23 10:21:46

标签: xamarin.ios xamarin.android portable-class-library

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的私钥进行签名。

更多信息:

  • 这在ICommand和INotifyCollectionChanged
  • 等接口中很常见
  • 它似乎只出现在.exe项目中(库以某种方式工作正常)
  • 我主要在VS2010和VS2012中测试/构建
  • 更多信息:https://github.com/slodge/MvvmCross/issues/41

有人能建议任何解决方法吗?例如有没有办法关闭强大的装配命名保护?

我认为如果要在微软出货的.Net实施之外真正实现PCL,我们需要这样做吗?

2 个答案:

答案 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