2012-10-23 27 views
7

PCL在MonoTouch和MonoDroid中可以很好地工作。MonoTouch/MonoDroid中的便攜式類庫強大的程序集引用問題

但是,有時,當我使用的變量在PCL來引用類型,然後我嘗試使用在MonoX客戶端相同的參考,則編譯器將失敗,這樣的消息:

類型'System.Collections.Specialized.INotifyCollectionChanged'在未引用的程序集中定義。您必須添加對程序集「System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e,Retargetable = Yes」的引用。

這裏的問題是,在我的MonoDroid的PCL System.Collections.Specialized.INotifyCollectionChanged在墊片轉發類型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

能anyo ne建議任何方式來解決這個問題?例如有沒有辦法將強大的組件命名保護關掉?

我認爲這是需要的,如果PCLs是真正的便攜式以外的微軟發佈的.Net實現?

回答

2

從管理員VS命令提示符下,你可以運行這個命令:

sn -Vr *,7cec85d7bea7798e 

這將跳過強名稱驗證與7cec85d7bea7798e作爲公鑰標記的任何組件。那麼你應該能夠用這個鍵來延遲簽名你的shim DLL。我認爲您可以使用sn -pc從DLL中提取密鑰的公共部分,以便將其用於延遲簽名。

這應該允許您使用墊片進行編譯。當然,它也需要在運行時工作。我認爲MonoTouch和MonoDroid實際上並沒有驗證程序集的強名稱密鑰,所以它只會起作用。如果他們確實做了這個驗證,那麼我認爲你不能做的事情很多。在這種情況下,Mono需要進行一些更改才能支持這些類型的引用或忽略墊片的密鑰,否則Microsoft需要提供您可以使用的shim DLL的簽名版本。

請注意,我不是安全專家,因此我不知道對您的計算機禁用強名稱驗證會對這些Microsoft密鑰產生何種安全影響。我不會認爲會有任何重大影響... ... -


詳細丹尼爾跟進:

我覺得這是你需要做的就是圍繞便攜庫類型共享/強名稱簽名的問題在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項目德爾使用提取的密鑰進行ay-sign。將下面在的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 

讓我知道這是如何工作!

感謝,

丹尼爾

+0

謝謝。我一直在運行代碼 - 所以你關於缺少運行時驗證的斷言似乎是正確的。我必須仔細研讀答案中的步驟以瞭解它們。我從來沒有做過任何代碼簽名,所以你的許多指令聽起來像是一門外語:)在我有一些工作後會回來更多的反饋。 – Stuart

-1

我已經在我的項目類似的問題在那裏我有PCL對於.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 
+0

你需要問這是一個真正引用這個問題的新問題。有人可能會幫助你(@dsplaisted最終幫助了我!) – Stuart