Visual studio 2010 在发布版本生成期间仅对具有强名称的程序集进行签名

Visual studio 2010 在发布版本生成期间仅对具有强名称的程序集进行签名,visual-studio-2010,build,continuous-integration,teamcity,assembly-signing,Visual Studio 2010,Build,Continuous Integration,Teamcity,Assembly Signing,场景是:我正在使用TeamCity构建解决方案,我没有以管理员身份运行构建帐户;所以我遇到了强名称键的问题 我知道一些解决方案,比如以管理员身份运行构建,并在适当的容器中注册证书 在解决方案文件中,是否只有在发布生成期间,而不是在调试生成期间,才可以对程序集进行签名。或者有类似的解决方案吗 我认为奇怪的是,无论程序集是否应该签名,都不能设置MSBuild参数。因为如果您查看csproj文件,其中有一个用于已签名或未签名的选项,您可以使用预处理器指令: #if SIGN //Only the Re

场景是:我正在使用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
然后在发布配置中定义
符号

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


#pragma
将取消显示

另一个选项是编辑项目文件。默认情况下,如果在Visual Studio中启用程序集签名,则它将用于所有生成配置。项目文件包含如下元素

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

真的
YourKeyFile.pfx
如果您只想在特定的生成配置(如发布)期间对程序集进行签名。您可以将
放在PropertyGroup元素中,并带有标识生成配置的条件

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

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

真的
YourKeyFile.pfx

注意:当您更改项目文件时,请执行以下操作。无法在Visual Studio中更改项目属性的签名设置。这意味着在Visual Studio中,如果您在Visual Studio中更改生成配置,则程序集的签名将被禁用。

以下是一个解决方案,其中程序集将在
版本
配置中签名,而不是在调试配置中。它使用项目中的签名工具,而不使用
[AssemblyKeyFile]
属性。这基本上和我的一样,但换言之

  • 在“项目首选项”的“签名”选项卡中设置要签名的项目
  • 卸载项目,并在XML编辑器中编辑它。找到
    SignAssembly
    属性。将该属性移动到两个与配置相关的属性组中。在调试配置中,将属性设置为false
  • 这将看起来像这样:

    
    假的
    真的
    
    Visual Studio即使在更改生成配置时也能正常工作,但“签名”选项卡中的“为程序集签名”复选框除外。我用VisualStudio2008进行了测试

    山洞吃:

    • 您需要删除
      [AssemblyKeyFile]
      属性才能使其工作
    • 如果您有
      [InternalsVisibleTo]
      属性,则需要维护两个版本,如下所示:
    #如果调试
    [汇编:InternalsVisibleTo(“MyLib.NUnit”)]
    #否则
    [程序集:InternalsVisibleTo(“MyLib.NUnit,PublicKey=“)]
    #恩迪夫
    

    换句话说,
    MyLib.NUnit
    也必须在
    Release
    configuration中签名。

    我将把预处理器指令放在哪里?我认为奇怪的是,没有一个MSBuild参数可以设置程序集是否应该被签名。因为如果你查看csproj文件,有一个选项可以选择已签名或未签名;通常在AssemblyInfo.cs中。对于MSBuild,这也是可能的;我不确定。有一个Msbuild参数:Msbuild(您的解决方案/项目)/p:SignAssembly=true/p:AssemblyOriginationWorkeyFile=yourKey.snkVisual Studio 2008似乎不支持以这种方式使
    SignAssembly
    属性有条件。在应用程序启动时,我有很多
    FileLoadException
    ,因为VisualStudio2008在不应该的时候签署了其中一个库,反之亦然。然后我需要重建应用程序。不确定Visual Studio的更高版本是否也会暴露此行为。