Pregunta

Tengo una pregunta que no sé si se puede resolver. Tengo un proyecto de C # en Visual Studio 2005 y quiero crear diferentes nombres de DLL en función de una constante del preprocesador. Lo que tengo en este momento es la constante del preprocesador, dos archivos snk y dos guías de ensamblaje. También creo dos configuraciones (Depuración y Preprocesador de depuración) y se compilan perfectamente usando el snk y la guía apropiada.

#if PREPROCESSOR_CONSTANT
[assembly: AssemblyTitle("MyLibraryConstant")]
[assembly: AssemblyProduct("MyLibraryConstant")]
#else
[assembly: AssemblyTitle("MyLibrary")]
[assembly: AssemblyProduct("MyLibrary")]
#endif

Ahora, tengo que colocar los dos conjuntos en el GAC. El primer conjunto se agrega sin problemas, pero el segundo no lo es.

¿Qué puedo hacer para crear dos o más ensamblajes diferentes de un proyecto de Visual Studio?

Es posible que olvidé incluir una nueva línea en " AssemblyInfo.cs " ¿Para cambiar el nombre de la DLL según la constante del preprocesador?

¿Fue útil?

Solución

Aquí hay un ejemplo de evento posterior a la compilación:

if "$(ConfigurationName)" == "Debug" goto Debug
if "$(ConfigurationName)" == "Release" goto Release

goto End

:Debug
del "$(TargetDir)DebugOutput.dll"
rename "$(TargetPath)" "DebugOutput.dll"

:Release
del "$(TargetDir)ReleaseOutput.dll"
rename "$(TargetPath)" "ReleaseOutput.dll"

:End

Cambie DebugOutput.dll y ReleaseOutput.dll a los nombres de archivo adecuados. puede cambiar " Debug " y " Release " para admitir otras configuraciones, y agregar secciones para admitir más configuraciones.


Ese script creará dos dlls con diferentes nombres de archivos; para crear dos nombres de ensamblados diferentes, tienes dos opciones.

El nombre del ensamblaje se crea como sigue :

Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'

Así que tienes que cambiar la información de la cultura, la versión o el nombre seguro.

Las dos opciones más simples son:

  1. Cambie la versión de ensamblaje:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. Cambie el archivo de claves: cree dos archivos de claves con la herramienta sn y en AssemblyInfo.cs :

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyKeyFile("FirstKey.snk")]
    #else
    [assembly: AssemblyKeyFile("SecondKey.snk")]
    #endif
    

Estas dos opciones darán como resultado dos ensamblajes diferentes en la medida en que el GAC lo sabe, ya que compara el nombre completo del ensamblaje y no el nombre 'simple'.

Otros consejos

Visual Studio no permite nombres de archivos de salida por configuración. Sin embargo, puede cambiar el nombre del archivo de salida como parte de su script de compilación. Puede hacer esto en su secuencia de comandos de MSBuild para el proyecto en cuestión.

Por ejemplo, ponga esto al final de su archivo .csproj :

<Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
    <Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>

No lo he intentado yo mismo, así que tómalo como una sugerencia amistosa. Intente editar manualmente su .csproj agregando o eliminando comentarios del objetivo de BeforeBuild con una inspiración de lo siguiente:

<Target Name="BeforeBuild">
    <AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>

Pienso que no hay tal manera. El nombre del ensamblaje de salida se fija estrictamente en la configuración del Proyecto: un ensamblaje por cada proyecto.

También los atributos de ensamblaje que proporcionó solo indican propiedades de ensamblaje visibles (por ejemplo, en el Explorador de Windows), no su nombre de archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top