2009-04-03 8 views
7

Tengo un archivo GlobalAssemblyInfo.cs en la raíz de mi solución, y tengo algo así como la siguiente entrada para permitir un fuerte nombre de mis conjuntos de salida.GlobalAssemblyInfo.cs y naming fuerte

#pragma warning disable 1699 
[assembly : AssemblyKeyFile("..\\keyfile.snk")] 
#pragma warning restore 1699 

Este enfoque tiene dos inconvenientes. En primer lugar, AssemblyKeyFileAttribute está en desuso, y para evitar las advertencias de compilación necesito las líneas pragma que ves arriba. En segundo lugar, o bien necesito mantener todos mis proyectos con la misma profundidad relativa a la raíz para usar la ruta relativa, o usar una ruta absoluta, que dicta una ubicación de salida en las máquinas de otros usuarios (y en servidores de integración/agentes de construcción continuos) .

¿Alguien tiene una mejor solución que esta, además de pasar por cada proyecto estableciendo una nomenclatura fuerte en el archivo del proyecto?

Respuesta

1

Esos atributos para la firma de claves se han desaprobado por una buena razón (pérdida de información), que es otra razón para seguir la ruta del proyecto.

Si tiene muchos proyectos, podría establecerlos a través de una macro grabada, o incluso manipular directamente los archivos .csproj (asegúrese de que estén descargados primero de VS).

2

Bueno, para evitar el problema de ruta puede usar [assembly:AssemblyKeyName(...)] en su lugar (aunque IIRC esto también está en desuso); use sn -i para instalar una clave con nombre. Cada máquina (que construye) necesitaría agregar esta clave.

Aparte de eso; sí, probablemente necesitarías editar los archivos del proyecto.

+0

Estoy de acuerdo, eso me da la vuelta al segundo problema. –

1

Richard hace una buena observación sobre la fuga de información: ahora he encontrado publicaciones del equipo de .NET de Microsoft donde describen esto. Así que me he ido por su sugerencia y llegar a la siguiente objetivo de NAnt:

<target name="strongName" description="Strong names the output DLLs"> 
    <foreach item="File" property="filename"> 
     <in> 
     <items> 
      <include name="**/*.csproj"></include> 
      <exclude name="**/*.Test.csproj"></include> 
     </items> 
     </in> 
     <do> 
     <echo message="${filename}" /> 
     <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:SignAssembly" value="false"> 
      <namespaces> 
      <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" /> 
      </namespaces> 
     </xmlpoke> 
     <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:AssemblyOriginatorKeyFile" value="..\keyfile.snk"> 
      <namespaces> 
      <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" /> 
      </namespaces> 
     </xmlpoke> 
     </do> 
    </foreach> 
    </target> 

Los espacios de nombres < > elemento es necesario que el XPath para ser resuelto en el archivo csproj - tenga en cuenta que esto es para VS2008 y algo ligeramente diferente puede ser necesario en VS2005.