2009-12-02 35 views
7

我管理一個開源項目,並想簽署項目二進制包中發佈的二進制文件。我使用Visual Studio csprojsln文件來管理和構建我的項目,並將這些文件作爲項目源代碼包的一部分進行分發。管理開源項目的強名密鑰對的建議方式是什麼?

我該如何簽署生成的二進制文件,而不必分發snk密鑰對文件?如果我使用Visual Studio簽署程序集,則每個項目文件現在都需要密鑰對的副本才能構建。即使密碼保護,我也不習慣分發密鑰對。

編輯

另一個需要注意的是,有些組件在通過InternalsVisibleToAttribute項目補助朋友訪問,並通過項目建設參考那些朋友。因此,在引用簽名程序集時,此類程序集需要使用強名稱。但是,如果密鑰對未分配,那麼最終用戶如何構建資源並維護項目關係?如果使用臨時密鑰對文件,那麼簽名程序集的公鑰令牌是否會發生更改,從而破壞了引用?

回答

2

Sharptooth's solution如果代碼中的唯一程序集引用是在項目文件中編碼的那些,則效果很好。如果您的項目通過InternalsVisibleToAttribute或其他需要使用強名稱字符串的方式引用其他程序集,則使用臨時密鑰構建存儲庫源是不可行的。這樣做會更改強名稱字符串中存在的公鑰引用並破壞代碼。

這是我的應用程序中的情況,所以我需要採用不同的方法。

我基本上在單獨的文件夾中創建了slncsproj文件副本,並修改了csproj文件,如下所示。

  • 轉換所有文件引用鏈接,指向原始來源。
  • 複製並修改每個AssemblyInfo.cs文件以包含具有強名稱的InternalsVisibleToAttribute的用法。
  • 改性每個csproj文件,以便snk文件參考是一個相對路徑(去除到snk文件複製到每個項目的需要)

我首先手動做所有這一切,但隨後意識到這可以以直接的方式自動化。第一步和第三步可以用XSLT來實現,其中第二步可以用正則表達式搜索/替換函數來實現。

由於我現在需要維護兩種解決方案,因此將此任務自動化以避免未來的麻煩是有意義的。

存儲庫中的源代碼不會使用強名稱構建程序集,這很好,因爲我不想在最終用戶上施加任何構建限制或進程。

7

你不應該分配密鑰對。強名稱用於驗證新版本的程序集來自同一個發佈者。

如果另一個開發人員想要分支項目,他們將生成自己的密鑰對,並且這將有效地顯示他們的版本不是來自您的,所以依賴於您的其他程序集將不會再加載,除非它們被重新編譯。這並不總是方便,但它可以保護您免受發佈惡意版本的程序集並以靜默方式分發它的用戶。

+0

因爲我需要分配項目和解決方案文件,並且由於解決方案需要使用密鑰對(啓用簽名時),我還應該分發一個「虛擬」密鑰對,以便最終用戶可以構建而不必操作項目文件?簽入禁用簽名的項目文件似乎很麻煩,但每次發佈時都必須切換此設置。 – 2009-12-02 15:04:04

+2

您可以執行以下操作:添加構建步驟,檢查.snk文件是否已經存在,並在需要時運行sn.exe生成新文件。然後它將直接從其他用戶的存儲庫中構建。 – sharptooth 2009-12-03 06:16:20

相關問題