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

Stu*_*art 7 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.INotifyCollectionChangedPCL是在一个垫片类型转发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

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

我认为如果PCL要在微软出货的.Net实现之外真正移植,那么这是必要的吗?

Dan*_*ted 2

从管理员 VS 命令提示符处,您可以运行以下命令:

\n\n
sn -Vr *,7cec85d7bea7798e\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将跳过任何使用 7cec85d7bea7798e 作为公钥令牌的程序集的强名称验证。然后您应该能够使用该密钥延迟签署您的 shim DLL。我认为您可以sn -pc从 DLL 中提取密钥的公共部分,以便将其用于延迟签名。

\n\n

这应该允许您使用垫片进行编译。当然,它也需要在运行时工作。我认为 MonoTouch 和 MonoDroid 实际上并不验证程序集的强名称键,因此它会起作用。如果他们确实进行了此验证,那么我认为您无能为力。在这种情况下,Mono 需要进行一些更改以支持这些类型引用或忽略填充程序的密钥,或者 Microsoft 需要提供您可以使用的填充程序 DLL 的签名版本。

\n\n

请注意,我不是安全专家,因此我不知道在您的计算机上禁用这些 Microsoft 密钥的强名称验证可能会产生什么样的安全影响。我认为不会有什么重大影响...

\n\n
\n\n

丹尼尔的详细跟进:

\n\n

我认为这是您需要解决 Mono 上可移植库的类型共享/强名称签名问题的方法:

\n\n

-> 提取System.Windows.dll的公钥,并将其放入Droid System.Windows项目的项目目录中:

\n\n
 Sn \xe2\x80\x93e "C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETPortable\\v4.0\\Profile\\Profile104\\System.Windows.dll" system_windows.snk\n
Run Code Online (Sandbox Code Playgroud)\n\n

-> 修改 Droid system.windows 项目以使用提取的密钥进行延迟签名。将以下内容放入 csproj 文件的 PropertyGroup 中:

\n\n
<SignAssembly>true</SignAssembly>\n<AssemblyOriginatorKeyFile>system_windows.snk</AssemblyOriginatorKeyFile>\n<DelaySign>true</DelaySign>\n
Run Code Online (Sandbox Code Playgroud)\n\n

-> 将 Droid System.Windows 项目(在 AssemblyInfo.cs 中)的程序集版本更改为:

\n\n
2.0.5.0 \n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的测试中,我\xe2\x80\x99t似乎不需要禁用强名称验证。因此,我不认为\xe2\x80\x99t 会给新手\xe2\x80\x93 带来任何额外的障碍,一旦你进行了这些更改,他们\xe2\x80\x99 只需要获取你的代码,它将正确构建。

\n\n

但是,如果您确实遇到问题,请尝试从管理 VS 命令提示符运行以下命令:

\n\n
 sn -Vr *,7cec85d7bea7798e \n
Run Code Online (Sandbox Code Playgroud)\n\n

让我知道这是如何运作的!

\n\n

谢谢,

\n\n

丹尼尔

\n