7

PCLは、MonoTouchおよびMonoDroidで適切に機能します。

ただし、変数を使用してPCLで型を参照し、MonoXクライアントで同じ参照を使用しようとすると、コンパイラが次のようなメッセージで失敗することがあります。

タイプ'System.Collections.Specialized.INotifyCollectionChanged'は、参照されていないアセンブリで定義されています。アセンブリ'System.Windows、Version = 2.0.5.0、Culture = neutral、PublicKeyToken = 7cec85d7bea7798e、Retargetable=Yes'への参照を追加する必要があります。

ここでの問題は、MonoDroidではSystem.Collections.Specialized.INotifyCollectionChangedPCLがshimタイプ転送DLL(https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/System.Windowsなど)で提供されていることと、明らかにMicrosoftのを使用してDLLに署名できないことです。秘密鍵。

いくつかの詳細:

  • これは、ICommandやINotifyCollectionChangedなどのインターフェイスでよく見られます
  • .exeプロジェクトでのみ発生するようです(ライブラリはどういうわけか問題なく動作します)
  • 私は主にVS2010とVS2012でテスト/構築しています
  • https://github.com/slodge/MvvmCross/issues/41でさらにいくつか

誰かがこれを解決する方法を提案できますか?たとえば、強力なアセンブリ命名保護をオフにする方法はありますか?

PCLがMicrosoftが出荷した.Net実装の外で真にポータブルであるためには、これが必要だと思いますか?

4

2 に答える 2

2

管理者VSコマンドプロンプトから、次のコマンドを実行できます。

sn -Vr *,7cec85d7bea7798e

これにより、公開鍵トークンとして7cec85d7bea7798eを使用するアセンブリの厳密な名前の検証がスキップされます。次に、そのキーを使用してshimDLLへの署名を遅らせることができるはずです。sn -pc遅延署名に使用するために、DLLからキーの公開部分を抽出するために使用できると思います。

これにより、シムを使用してコンパイルできるようになります。もちろん、実行時にも機能する必要があります。MonoTouchとMonoDroidは、アセンブリの厳密な名前キーを実際には検証しないので、機能するだけだと思います。彼らがこの検証を行う場合、私はあなたができることはあまりないと思います。その場合、Monoはこれらの型参照をサポートするためにいくつかの変更を行うか、シムのキーを無視する必要があります。または、Microsoftは使用できるシムDLLの署名付きバージョンを提供する必要があります。

私はセキュリティの専門家ではないため、これらのMicrosoftキーのマシンで強力な名前の検証を無効にするとどのようなセキュリティの影響があるのか​​わかりません。大きな影響はないと思います...


ダニエルからの詳細なフォローアップ:

これは、Monoのポータブルライブラリの型共有/厳密な名前署名の問題を回避するために必要なことだと思います。

-> System.Windows.dllの公開鍵を抽出し、それをDroidSystem.Windowsプロジェクトのプロジェクトディレクトリに配置します。

 Sn –e "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile104\System.Windows.dll" system_windows.snk

->抽出されたキーを使用して遅延署名するようにDroidsystem.windowsプロジェクトを変更します。csprojファイルのPropertyGroupに以下を入力します。

<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>system_windows.snk</AssemblyOriginatorKeyFile>
<DelaySign>true</DelaySign>

-> Droid System.Windowsプロジェクト(AssemblyInfo.cs内)のアセンブリバージョンを次のように変更します。

2.0.5.0 

私のテストでは、強力な名前の検証を無効にする必要はなかったようです。したがって、初心者にとって追加の障壁になるとは思いません。これらの変更を行った後は、コードを取得するだけで、正しくビルドされます。

ただし、問題が発生した場合は、管理者VSコマンドプロンプトから次のコマンドを実行してみてください。

 sn -Vr *,7cec85d7bea7798e 

これがどのように機能するか教えてください!

ありがとう、

ダニエル

于 2012-10-23T14:01:14.343 に答える
-1

PCL for .Net 4.5、Windows Phone 8、WinRT、MonoTouch、MonoDroidを使用しているプロジェクトでも同様の問題が発生します。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
于 2013-02-28T16:28:23.260 に答える