|
由于我們的項(xiàng)目底層使用到一個通過LogicalCallContext實(shí)現(xiàn)的上下文數(shù)據(jù)管理框架,導(dǎo)致所有的Unit Test不能正常運(yùn)行。具體的現(xiàn)象在《只在UnitTest和WebHost中的出現(xiàn)的關(guān)于LogicalCallContext的嚴(yán)重問題》有過詳細(xì)的介紹。解決的方案就是對相關(guān)的程序集進(jìn)行強(qiáng)簽名,并加到GAC中,是Unit Test能夠識別基于 LogicalCallContext項(xiàng)目的類型。有了Visual Studio這個強(qiáng)大的IDE,程序集的簽名工作很好實(shí)現(xiàn)——僅僅需要在Project的Properties對象框的Signing Tab中指定一個Key File就可以了。但是,Visual Studio做得不夠好。
一、Visual Studio會自作主張地在項(xiàng)目根目錄下復(fù)制一個Key File
舉個例子,假設(shè)一個解決方案中具有兩個項(xiàng)目:Lib1和Lib2。現(xiàn)在我們需要使用“同一個Key File”對Lib1和Lib2進(jìn)行簽名,Lib1、Lib2和Key File(Key.snk) 對應(yīng)的目錄結(jié)構(gòu)如右圖所示:Key.snk和Lib1和Lib2處在相同的目錄下面。
現(xiàn)在我們右擊Lib1項(xiàng)目文件,選擇Properties菜單項(xiàng)進(jìn)行項(xiàng)目屬性對話框,選擇Signing Tab頁進(jìn)行程序集簽名相關(guān)設(shè)置。選中Sign the assembly復(fù)選框,在下拉框中選擇<Browse>選項(xiàng),并在彈出的文件選擇對話框中我們的Key File:Key.snk。
但是當(dāng)你選中Key.snk這個文件的時候,Visual Studio并不會用將這個文件作為對本程序集進(jìn)行簽名的Key File,而是會自作主張地將該文件拷貝到Lib1所在的根目錄下。最終被用于程序集簽名的不是我們希望的那個File Key,而是該File Key的復(fù)制品(如下圖所示)。
我不太明白微軟如此設(shè)計(jì)具有怎樣的考慮,但是對于我們目前的項(xiàng)目來說,我是無法接受的。上面的例子中只有兩個需要簽名的項(xiàng)目,就需要維護(hù)兩個Key File,但是我們的項(xiàng)目中有數(shù)十個項(xiàng)目,就意味著需要維護(hù)數(shù)十個不同的Key File,從維護(hù)的角度講,如果有朝一日我需要更換另一個Key File, 我就需要為每個項(xiàng)目進(jìn)行更新。
那么我們有沒有辦法讓所有項(xiàng)目采用同一個Key File進(jìn)行簽名呢?當(dāng)然有,不然我也不會寫這篇文章了。總的來說,我們?nèi)N不同的解決方案。
解決方案1:通過AssemblyKeyFileAttribute特性指定Key File
AssemblyKeyFileAttribute特性定義在System.Reflection命名空間下,專門用于指定在對項(xiàng)目進(jìn)行強(qiáng)簽名時采用的Key File。所以我們只需要在AssemblyInfo.cs中(也可以在其它地方)指定我們采用的Key File文件路徑即可。通過下面的代碼,我們指定我們對Lib1項(xiàng)目指定了我真正期望用于進(jìn)行簽名的那個Key File。
1: [assembly: AssemblyVersion("1.0.0.0")]
2: [assembly: AssemblyFileVersion("1.0.0.0")]
3: [assembly: AssemblyKeyFile("..//Key.snk")]
NET技術(shù):Visual Studio對程序集簽名時一個很不好用的地方,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。