轉(zhuǎn)帖|其它|編輯:郝浩|2010-09-14 13:40:43.000|閱讀 835 次
概述:由于我們的項目底層使用到一個通過LogicalCallContext實現(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項目的類型。有了Visual Studio這個強(qiáng)大的IDE,程序集的簽名工作很好實現(xiàn)——僅僅需要在Project的Properties對象框的Signing Tab中指定一個Key File就可以了。但是,Visual Studio做得不夠好。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
由于我們的項目底層使用到一個通過LogicalCallContext實現(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項目的類型。有了Visual Studio這個強(qiáng)大的IDE,程序集的簽名工作很好實現(xiàn)——僅僅需要在Project的Properties對象框的Signing Tab中指定一個Key File就可以了。但是,Visual Studio做得不夠好。
一、Visual Studio會自作主張地在項目根目錄下復(fù)制一個Key File
舉個例子,假設(shè)一個解決方案中具有兩個項目: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項目文件,選擇Properties菜單項進(jìn)行項目屬性對話框,選擇Signing Tab頁進(jìn)行程序集簽名相關(guān)設(shè)置。選中Sign the assembly復(fù)選框,在下拉框中選擇<Browse>選項,并在彈出的文件選擇對話框中我們的Key File:Key.snk。
但是當(dāng)你選中Key.snk這個文件的時候,Visual Studio并不會用將這個文件作為對本程序集進(jìn)行簽名的Key File,而是會自作主張地將該文件拷貝到Lib1所在的根目錄下。最終被用于程序集簽名的不是我們希望的那個File Key,而是該File Key的復(fù)制品(如右圖所示)。
我不太明白微軟如此設(shè)計具有怎樣的考慮,但是對于我們目前的項目來說,我是無法接受的。上面的例子中只有兩個需要簽名的項目,就需要維護(hù)兩個Key File,但是我們的項目中有數(shù)十個項目,就意味著需要維護(hù)數(shù)十個不同的Key File,從維護(hù)的角度講,如果有朝一日我需要更換另一個Key File, 我就需要為每個項目進(jìn)行更新。
那么我們有沒有辦法讓所有項目采用同一個Key File進(jìn)行簽名呢?當(dāng)然有,不然我也不會寫這篇文章了。總的來說,我們?nèi)N不同的解決方案。
解決方案1:通過AssemblyKeyFileAttribute特性指定Key File
AssemblyKeyFileAttribute特性定義在System.Reflection命名空間下,專門用于指定在對項目進(jìn)行強(qiáng)簽名時采用的Key File。所以我們只需要在AssemblyInfo.cs中(也可以在其它地方)指定我們采用的Key File文件路徑即可。通過下面的代碼,我們指定我們對Lib1項目指定了我真正期望用于進(jìn)行簽名的那個Key File。
1: [assembly: AssemblyVersion("1.0.0.0")]
2: [assembly: AssemblyFileVersion("1.0.0.0")]
3: [assembly: AssemblyKeyFile("..\\Key.snk")]
但是,這并不是一種推薦的Key File指定方式。當(dāng)你添加了AssemblyKeyFileAttribute特性的時候,Visual Studio會有如下一個警告:“Use command line option '/keyfile' or appropriate project settings instead of 'AssemblyKeyFile'”。提示你采用另外兩種方案:命令行或者項目設(shè)置。
解決方案2:通過命令行進(jìn)行強(qiáng)簽名
相信大家對通過命令行對程序集進(jìn)行強(qiáng)簽名的方式都不會感到陌生。這種方式就是直接使用.NET Framework為我們提供的強(qiáng)名稱工具(SN.exe: Strong Name Tool)。關(guān)于SN.exe相關(guān)參數(shù)設(shè)定可以參考MSDN在線文檔(//msdn.microsoft.com/en-us/library/k5b5tt23(VS.80).aspx),在這里就不再贅言介紹了。
解決方案3:還是通過項目設(shè)置(Project Setting)
還是使用文章剛開始的那種方式,直接設(shè)置項目關(guān)于簽名(Signing)的相關(guān)屬性。有人會說了,你不是說這種方式會導(dǎo)致Key File的復(fù)制嗎,為何還要使用這種方式。為此,我們需要換一種思維:通過項目設(shè)置對象框?qū)椖窟M(jìn)行的所有設(shè)置最終都會反映在項目文件中(.csproj或者.vbproj)。雖然通過Visual Studio不能實現(xiàn)我們的目標(biāo),如果我們直接更新項目文件呢?實踐證明,這種方案時可行的。為此,我們通過NotePad打開Lib1的項目文件Lib1.csproj,在<ProjectGroup>元素中加上一個<AssemblyOriginatorKeyFile>元素,并指定Key File的路徑(..\Key.snk)即可。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"
xmlns="//schemas.microsoft.com/developer/msbuild/2003">
......
<PropertyGroup>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<AssemblyOriginatorKeyFile>..\Key.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
</Project>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載