這種情況是:我正在用TeamCity構建我的解決方案,我沒有以管理員身份運行構建帳戶;所以我遇到了強大的名字鍵問題。在發佈版本中只簽署具有強名稱的程序集
我知道一些解決方案,例如以管理員身份運行構建並將證書註冊到適當的容器中。
有沒有辦法在解決方案文件中籤署程序集,只在發佈版本期間而不是在調試版本期間。或者有沒有類似的解決方案?
我覺得奇怪的是,沒有一個MSBuild參數可以在程序集應該簽名或者不簽名的時候設置。因爲如果你看的csproj,文件中有一個選項那裏簽署或尚未簽署
這種情況是:我正在用TeamCity構建我的解決方案,我沒有以管理員身份運行構建帳戶;所以我遇到了強大的名字鍵問題。在發佈版本中只簽署具有強名稱的程序集
我知道一些解決方案,例如以管理員身份運行構建並將證書註冊到適當的容器中。
有沒有辦法在解決方案文件中籤署程序集,只在發佈版本期間而不是在調試版本期間。或者有沒有類似的解決方案?
我覺得奇怪的是,沒有一個MSBuild參數可以在程序集應該簽名或者不簽名的時候設置。因爲如果你看的csproj,文件中有一個選項那裏簽署或尚未簽署
您可以使用預處理程序指令:
#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。
另一種選擇是編輯項目文件。默認情況下,如果您在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中更改了構建配置。
下面是一個解決方案,其中組件在Release
配置中被簽名,但在Debug配置中沒有。它使用項目中的簽名設施,而不使用[AssemblyKeyFile]
屬性。這與Jehof's answer基本相同,換句話說。
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
配置簽署。
Visual Studio 2008似乎不支持以這種方式使'SignAssembly'屬性有條件。在應用程序啓動時,我有很多'FileLoadException',因爲Visual Studio 2008在不應該的時候簽名了一個庫,反之亦然。然後我需要重建應用程序。不確定Visual Studio的更高版本是否也暴露了這種行爲。 – tm1
有一個MSBuild的參數: 的MSBuild(YourSolution /項目)/ P:SignAssembly =真/p:AssemblyOriginatorKeyFile=yourKey.snk – SvenG