9

El escenario es: estoy creando mi solución con TeamCity, no estoy ejecutando la cuenta de compilación como administrador; así que tengo problemas con las teclas de nombre fuerte.Solo ensambles de signo con nombre seguro durante la versión de lanzamiento

Conozco algunas soluciones, como ejecutar la compilación como administrador y registrar los certificados en el contenedor adecuado.

De todos modos, hay que firmar los ensamblados dentro de un archivo de solución solo durante una compilación de lanzamiento y no durante una compilación de depuración. ¿O hay soluciones similares?

Creo que es extraño que no haya un parámetro MSBuild que se pueda establecer si los ensamblajes se deben firmar o no. Porque si nos fijamos en las csproj-archivos hay una opción para no firmado o no firmado

+3

hay un parámetro MSBUILD: msbuild (YourSolution/Proyecto)/t: SignAssembly = true /p:AssemblyOriginatorKeyFile=yourKey.snk – SvenG

Respuesta

3

Puede utilizar las directivas de preprocesador:

#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 

a continuación, definir el símbolo SIGN en la configuración de lanzamiento.

Debe instalar la llave en un contenedor de llave usando sn.exe. Alternativamente, puede usar [AssemblykeyFile] para especificar una ruta.

El #pragma suprime this warning.

+0

dónde voy a poner las directivas del preprocesador? Me parece extraño que no haya un parámetro de MSBuild que pueda establecer si los ensamblajes deben estar firmados o no. Porque si miras los archivos csproj hay una opción allí para firmar o no firmar. – Felix

+1

en cualquier lugar; típicamente en AssemblyInfo.cs. Esto también podría ser posible con MSBuild; No estoy seguro. – SLaks

10

Otra opción es editar el archivo del proyecto. De forma predeterminada, si habilita la firma de ensamblaje en Visual Studio, se usará para todas las configuraciones de compilación. El archivo de proyecto contiene un elemento como el siguiente.

<PropertyGroup> 
    <SignAssembly>true</SignAssembly> 
</PropertyGroup> 
<PropertyGroup> 
    <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile> 
</PropertyGroup> 

Si solo desea firmar los ensamblajes durante una configuración de compilación específica, como LIBERACIÓN. Puede poner <SignAssembly> y <AssemblyOriginatorKeyFile> en el elemento PropertyGroup con la condición que identifica su configuración de compilación.

Por lo tanto, si desea firmar su ensamblaje durante una versión de lanzamiento, puede cambiar el archivo del proyecto a lo siguiente.

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

Nota: cuando se cambia el archivo de proyecto, a lo siguiente. no puede cambiar la configuración de firma de las Propiedades del proyecto en Visual Studio. Eso significa que en Visual Studio se está deshabilitando la firma del ensamblado, también si se cambia la configuración de compilación en Visual Studio.

2

Aquí hay una solución donde el ensamblado está firmado en la configuración Release, pero no en la configuración de depuración. Utiliza las instalaciones de firma del proyecto, sin utilizar el atributo [AssemblyKeyFile]. Básicamente es lo mismo que Jehof's answer, pero en otras palabras.

  1. Configure el proyecto para la firma en el pestaña de firma en las preferencias del proyecto.
  2. Descargue el proyecto y edítelo en el editor XML. Busque la propiedad SignAssembly. Mueva esa propiedad a los dos grupos de propiedades dependientes de la configuración. En la configuración de depuración, establezca la propiedad en falso.

Esto se verá algo como esto:

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

Visual Studio funciona correctamente incluso cuando se cambia a construir configuraciones, con la excepción de la sesión la casilla de verificación de montaje en el Firma pestaña. He probado con Visual Studio 2008.

cueva-come:

  • Es necesario eliminar el atributo [AssemblyKeyFile] para que esto funcione.
  • Si tiene [InternalsVisibleTo] atributos, es necesario mantener dos versiones, así:
#if DEBUG 
[assembly: InternalsVisibleTo("MyLib.NUnit")] 
#else 
[assembly: InternalsVisibleTo("MyLib.NUnit, PublicKey=<your public key>")] 
#endif 

En otras palabras, MyLib.NUnit también debe ser firmado en la configuración Release.

+0

Visual Studio 2008 no parece ser compatible con la condicionalidad de la propiedad 'SignAssembly' de esta manera. Tengo muchas 'FileLoadException' al inicio de la aplicación, ya que Visual Studio 2008 firma una de las bibliotecas cuando no debería, y viceversa. Entonces necesito reconstruir la aplicación. No estoy seguro si las versiones posteriores de Visual Studio también exponen este comportamiento. – tm1

Cuestiones relacionadas