9

這種情況是:我正在用TeamCity構建我的解決方案,我沒有以管理員身份運行構建帳戶;所以我遇到了強大的名字鍵問題。在發佈版本中只簽署具有強名稱的程序集

我知道一些解決方案,例如以管理員身份運行構建並將證書註冊到適當的容器中。

有沒有辦法在解決方案文件中籤署程序集,只在發佈版本期間而不是在調試版本期間。或者有沒有類似的解決方案?

我覺得奇怪的是,沒有一個MSBuild參數可以在程序集應該簽名或者不簽名的時候設置。因爲如果你看的csproj,文件中有一個選項那裏簽署或尚未簽署

+3

有一個MSBuild的參數: 的MSBuild(YourSolution /項目)/ P:SignAssembly =真/p:AssemblyOriginatorKeyFile=yourKey.snk – SvenG

回答

3

您可以使用預處理程序指令:

#if SIGN 
//Only the Release build is signed 
#pragma warning disable 1699 //We can't use the compiler switch 
[assembly: AssemblyKeyName("KeyContainerName")] 
#pragma warning restore 1699 
#endif 

然後在Release配置定義SIGN符號。

您必須使用sn.exe將密鑰安裝到密鑰容器中。或者,您可以使用[AssemblykeyFile]指定路徑。

#pragma取消this warning

+0

會在哪裏我把預處理指令?我覺得奇怪的是沒有一個MSBuild參數可以設置程序集是否被簽名。因爲如果您查看csproj文件,那麼有一個選項用於簽名或不簽名。 – Felix

+1

任何地方;通常在AssemblyInfo.cs中。這也可能是MSBuild可能的;我不確定。 – SLaks

10

另一種選擇是編輯項目文件。默認情況下,如果您在Visual Studio中啓用程序集簽名,它將用於所有構建配置。該項目文件包含一個像下面這樣的元素。

<PropertyGroup> 
    <SignAssembly>true</SignAssembly> 
</PropertyGroup> 
<PropertyGroup> 
    <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile> 
</PropertyGroup> 

如果您只想在特定的構建配置(例如RELEASE)期間簽署程序集。您可以將<SignAssembly><AssemblyOriginatorKeyFile>置於PropertyGroup元素中,並使用Condition標識您的構建配置。

因此,如果您想在發佈版本中籤署您的程序集,可以將項目文件更改爲以下內容。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <!-- other element of this PropertyGroup --> 
    <SignAssembly>true</SignAssembly>  
    <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile> 
</PropertyGroup> 

注:當你改變你的項目文件,下面的內容。您無法更改Visual Studio中項目屬性的簽名設置。這意味着在Visual Studio中禁用了程序集的簽名,並且如果在Visual Studio中更改了構建配置。

2

下面是一個解決方案,其中組件在Release配置中被簽名,但在Debug配置中沒有。它使用項目中的簽名設施,而不使用[AssemblyKeyFile]屬性。這與Jehof's answer基本相同,換句話說。

  1. 設置的項目,在項目的喜好簽名標籤簽署。
  2. 卸載項目,並在XML編輯器中對其進行編輯。找到SignAssembly屬性。將該屬性移動到兩個配置相關的屬性組中。在Debug配置中,將該屬性設置爲false。

這將是這個樣子:當改變編譯配置,以除外

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> 
    <!-- ... --> 
    <SignAssembly>false</SignAssembly> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> 
    <SignAssembly>true</SignAssembly> 
</PropertyGroup> 

Visual Studio的工作,即使正確註冊在裝配複選框簽名標籤。我與Visual Studio 2008

窯洞餐館測試:

  • 您需要刪除[AssemblyKeyFile]屬性這個工作。
  • 如果你有[InternalsVisibleTo]屬性,你需要維護兩個版本,就像這樣:
#if DEBUG 
[assembly: InternalsVisibleTo("MyLib.NUnit")] 
#else 
[assembly: InternalsVisibleTo("MyLib.NUnit, PublicKey=<your public key>")] 
#endif 

換句話說,MyLib.NUnit也必須Release配置簽署。

+0

Visual Studio 2008似乎不支持以這種方式使'SignAssembly'屬性有條件。在應用程序啓動時,我有很多'FileLoadException',因爲Visual Studio 2008在不應該的時候簽名了一個庫,反之亦然。然後我需要重建應用程序。不確定Visual Studio的更高版本是否也暴露了這種行爲。 – tm1

相關問題