Visual Studio對程式集簽名時一個很不好用的地方

來源:互聯網
上載者:User

由於我們的項目底層使用到一個通過LogicalCallContext實現的上下文資料管理架構,導致所有的Unit Test不能正常運行。具體的現象在《只在UnitTest和WebHost中的出現的關於LogicalCallContext的嚴重問題》有過詳細的介紹。解決的方案就是對相關的程式集進行強簽名,並加到GAC中,是Unit Test能夠識別基於LogicalCallContext項目的類型。有了Visual Studio這個強大的IDE,程式集的簽名工作很好實現——僅僅需要在Project的Properties對象框的Signing Tab中指定一個Key File就可以了。但是,Visual Studio做得不夠好。

一、Visual Studio會自作主張地在項目根目錄下複製一個Key File

舉個例子,假設一個解決方案中具有兩個項目:Lib1和Lib2。現在我們需要使用“同一個Key File”對Lib1和Lib2進行簽名,Lib1、Lib2和Key File(Key.snk) 對應的目錄結構如右圖所示:Key.snk和Lib1和Lib2處在相同的目錄下面。

現在我們右擊Lib1專案檔,選擇Properties功能表項目進行項目屬性對話方塊,選擇Signing Tab頁進行程式集簽名相關設定。選中Sign the assembly複選框,在下拉框中選擇<Browse>選項,並在彈出的檔案選擇對話方塊中我們的Key File:Key.snk。

但是當你選中Key.snk這個檔案的時候,Visual Studio並不會用將這個檔案作為對本程式集進行簽名的Key File,而是會自作主張地將該檔案拷貝到Lib1所在的根目錄下。最終被用於程式集簽名的不是我們希望的那個File Key,而是該File Key的複製品(如右圖所示)。

我不太明白微軟如此設計具有怎樣的考慮,但是對於我們目前的項目來說,我是無法接受的。上面的例子中只有兩個需要簽名的項目,就需要維護兩個Key File,但是我們的項目中有數十個項目,就意味著需要維護數十個不同的Key File,從維護的角度講,如果有朝一日我需要更換另一個Key File, 我就需要為每個項目進行更新。

那麼我們有沒有辦法讓所有項目採用同一個Key File進行簽名呢?當然有,不然我也不會寫這篇文章了。總的來說,我們三種不同的解決方案。

解決方案1:通過AssemblyKeyFileAttribute特性指定Key File

AssemblyKeyFileAttribute特性定義在System.Reflection命名空間下,專門用於指定在對項目進行強簽名時採用的Key File。所以我們只需要在AssemblyInfo.cs中(也可以在其它地方)指定我們採用的Key File檔案路徑即可。通過下面的代碼,我們指定我們對Lib1項目指定了我真正期望用於進行簽名的那個Key File。

   1: [assembly: AssemblyVersion("1.0.0.0")]

   2: [assembly: AssemblyFileVersion("1.0.0.0")]

   3: [assembly: AssemblyKeyFile("..\\Key.snk")]

但是,這並不是一種推薦的Key File指定方式。當你添加了AssemblyKeyFileAttribute特性的時候,Visual Studio會有如下一個警告:“Use command line option '/keyfile' or appropriate project settings instead of 'AssemblyKeyFile'”。提示你採用另外兩種方案:命令列或者項目設定。

解決方案2:通過命令列進行強簽名

相信大家對通過命令列對程式集進行強簽名的方式都不會感到陌生。這種方式就是直接使用.NET Framework為我們提供的強式名稱工具(SN.exe: Strong Name Tool)。關於SN.exe相關參數設定可以參考MSDN線上文檔(http://msdn.microsoft.com/en-us/library/k5b5tt23(VS.80).aspx),在這裡就不再贅言介紹了。

解決方案3:以Link的方式添加Key File

這是我最初想到的辦法,但是當我實驗的時候將Key File添加到專案檔的Properties子目錄下,導致它重新建立新的File File。但是有人評論說這個方式是可行的,所有我嘗試了一下,只要將Key File以Link的方式添加到項目的根目錄下就可以了。

解決方案4:還是通過項目設定(Project Setting)

還是使用文章剛開始的那種方式,直接設定項目關於簽名(Signing)的相關屬性。有人會說了,你不是說這種方式會導致Key File的複製嗎,為何還要使用這種方式。為此,我們需要換一種思維:通過項目設定對象框對項目進行的所有設定最終都會反映在專案檔中(.csproj或者.vbproj)。雖然通過Visual Studio不能實現我們的目標,如果我們直接更新專案檔呢?實踐證明,這種方案時可行的。為此,我們通過NotePad開啟Lib1的專案檔Lib1.csproj,在<ProjectGroup>元素中加上一個<AssemblyOriginatorKeyFile>元素,並指定Key File的路徑(..\Key.snk)即可。

   1: <?xml version="1.0" encoding="utf-8"?>

   2: <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

   3:   ......

   4:   <PropertyGroup>

   5:     <SignAssembly>true</SignAssembly>

   6:   </PropertyGroup>

   7:   <PropertyGroup>

   8:     <AssemblyOriginatorKeyFile>..\Key.snk</AssemblyOriginatorKeyFile>

   9:   </PropertyGroup>  

  10: </Project>

作者:Artech

出處:http://artech.cnblogs.com

本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.