仅在发布版本期间为具有强名称的程序集签名

时间:2011-10-26 13:31:04

标签: visual-studio-2010 build continuous-integration teamcity assembly-signing

方案是:我正在使用TeamCity构建我的解决方案,我没有以管理员身份运行构建帐户;所以我对强名称键有疑问。

我知道一些解决方案,比如以管理员身份运行构建并在适当的容器中注册证书。

无论如何,仅在发布版本期间而不是在调试版本期间对解决方案文件中的程序集进行签名。或者有类似的解决方案吗?

我认为奇怪的是,没有一个MSBuild参数可以设置,无论是否应该签署程序集。因为如果你查看csproj文件,那里有一个用于签名或未签名的选项

3 个答案:

答案 0 :(得分:11)

另一种选择是编辑项目文件。默认情况下,如果在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中更改了构建配置。

答案 1 :(得分:4)

您可以使用预处理程序指令:

#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

答案 2 :(得分:3)

这是一个解决方案,其中程序集在Release配置中签名,但在调试配置中没有。它使用项目中的签名工具,而不使用[AssemblyKeyFile]属性。它与Jehof's answer基本相同,但换句话说。

  1. 设置项目以登录项目首选项中的签名选项卡。
  2. 卸载项目,并在XML编辑器中对其进行编辑。找到SignAssembly属性。将该属性移动到两个配置相关的属性组中。在Debug配置中,将该属性设置为false。
  3. 这看起来像这样:

    <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配置中签名。