场景如下:我正在使用TeamCity构建我的解决方案,我不是以管理员身份运行构建帐户;因此我遇到了强名称密钥的问题。
我知道有一些解决方案,比如以管理员身份运行构建并在正确的容器中注册证书。
是否有任何方法可以仅在发布构建期间而不是在调试构建期间仅为解决方案文件签名程序集。或者是否有类似的解决方案?
我认为很奇怪,居然没有MSBuild参数可以设置程序集是否应该签名。因为如果你看一下csproj文件,那里有一个选项用于签名或未签名。
场景如下:我正在使用TeamCity构建我的解决方案,我不是以管理员身份运行构建帐户;因此我遇到了强名称密钥的问题。
我知道有一些解决方案,比如以管理员身份运行构建并在正确的容器中注册证书。
是否有任何方法可以仅在发布构建期间而不是在调试构建期间仅为解决方案文件签名程序集。或者是否有类似的解决方案?
我认为很奇怪,居然没有MSBuild参数可以设置程序集是否应该签名。因为如果你看一下csproj文件,那里有一个选项用于签名或未签名。
另一个选项是编辑项目文件。默认情况下,在Visual Studio中启用程序集签名后,它将用于所有构建配置。项目文件包含以下类似的元素。
<PropertyGroup>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup>
如果你只想在特定的构建配置(例如RELEASE)中签署程序集,你可以将<SignAssembly>
和<AssemblyOriginatorKeyFile>
放置在PropertyGroup元素中,并设置条件以标识您的构建配置。
因此,如果您想在发布构建期间签署程序集,则可以将项目文件更改为以下内容。
<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的答案相同,只是用其他措辞表述。
SignAssembly
属性。 将该属性移动到两个配置相关的属性组中。 在Debug配置中,将属性设置为false。<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<!-- ... -->
<SignAssembly>false</SignAssembly>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<SignAssembly>true</SignAssembly>
</PropertyGroup>
#if DEBUG
[assembly: InternalsVisibleTo("MyLib.NUnit")]
#else
[assembly: InternalsVisibleTo("MyLib.NUnit, PublicKey=<your public key>")]
#endif
MyLib.NUnit
在 Release
配置下也必须被签名。SignAssembly
属性设置为条件。由于Visual Studio 2008在不应该签署其中一个库时签署了其中一个库,反之亦然,因此在应用程序启动时会出现许多FileLoadException
。然后我需要重新构建应用程序。不确定Visual Studio的后续版本是否也暴露了这种行为。 - tm1#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
抑制此警告。