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

Fel*_*lix 11 teamcity continuous-integration build visual-studio-2010 assembly-signing

方案是:我正在使用TeamCity构建我的解决方案,我没有以管理员身份运行构建帐户; 所以我遇到了强名称密钥的问题.

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

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

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

Jeh*_*hof 11

另一种选择是编辑项目文件.默认情况下,如果在Visual Studio中启用程序集签名,则它将用于所有构建配置.项目文件包含如下所示的元素.

<PropertyGroup>
  <SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
  <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

如果您只想在特定的构建配置(例如RELEASE)期间对程序集进行签名.你可以把<SignAssembly><AssemblyOriginatorKeyFile>与识别生成配置条件下的PropertyGroup元素.

因此,如果要在发布版本期间对程序集进行签名,可以将项目文件更改为以下内容.

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

注意:更改项目文件时,请执行以下操作.您无法在Visual Studio中更改项目属性的签名设置.这意味着在Visual Studio中禁用了程序集的签名,如果在Visual Studio中更改了构建配置.


tm1*_*tm1 5

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

  1. 在项目首选项的“ 签名”选项卡中设置要签名的项目。
  2. 卸载项目,然后在XML编辑器中对其进行编辑。找到SignAssembly属性。将该属性移到两个依赖配置的属性组中。在“调试”配置中,将该属性设置为false。

看起来像这样:

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

即使更改了生成配置,Visual Studio仍可以正常工作,但“ 签名”选项卡中的“ 签名程序集”复选框除外。我使用Visual Studio 2008进行了测试。

洞穴食用:

  • 您需要删除该[AssemblyKeyFile]属性才能正常工作。
  • 如果具有[InternalsVisibleTo]属性,则需要维护两个版本,例如:
#if DEBUG
[assembly: InternalsVisibleTo("MyLib.NUnit")]
#else
[assembly: InternalsVisibleTo("MyLib.NUnit, PublicKey=<your public key>")]
#endif
Run Code Online (Sandbox Code Playgroud)

换句话说,MyLib.NUnit还必须在Release配置中签名。


SLa*_*aks 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
Run Code Online (Sandbox Code Playgroud)

SIGN然后在Release配置中定义符号。

您必须使用 将密钥安装到密钥容器中sn.exe。或者,您可以使用[AssemblykeyFile]来指定路径。

压制这个#pragma警告。