Pergunta

Eu tenho uma pergunta que eu não sei se ele pode ser resolvido. Eu tenho projeto de um C # no Visual Studio 2005 e eu quero criar nomes DLL diferentes, dependendo uma constante pré-processador. O que eu tenho neste momento é a constante pré-processador, dois arquivos SNK e guid dois de montagem. Eu também criar duas configurações (Debug e Debug pré-processador) e eles compilar perfeitamente usando a SNK e apropriada guid.

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

Agora, eu tenho que colocar os dois conjuntos no GAC. A primeira montagem é adicionada sem problemas, mas o segundo não é.

O que posso fazer para criar duas ou montagens mais diferentes de um projeto Visual Studio?

É possível que eu esqueci de incluir uma nova linha em "AssemblyInfo.cs" para mudar o nome da DLL dependendo da constante pré-processador?

Foi útil?

Solução

Aqui está um exemplo de evento pós-compilação:

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

Alterar DebugOutput.dll e ReleaseOutput.dll para os nomes de arquivos apropriados. você pode mudar "Debug" e "Release" para apoiar outras configurações, e adicionar seções para suportar mais configurações.


Esse script criará dois dlls com diferentes nomes de arquivos; para criar dois AssemblyNames diferentes, você tem duas opções.

O nome do assembly é construído como segue :

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

Então, você tem que quer mudar a informação cultura, a versão ou o nome forte.

As duas opções mais simples são:

  1. Alterar a versão do assembly:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. Alterar o keyfile - criar dois keyfiles com a ferramenta sn, e em AssemblyInfo.cs:

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

Ambas as opções irá resultar em dois conjuntos diferentes, tanto quanto o GAC sabe -., Uma vez que compara o nome de montagem completa, e não o 'simples' nome

Outras dicas

Visual Studio não permite nomes de arquivos de saída per-configuração. No entanto, você pode mudar o nome do arquivo de saída como parte de seu script de construção. Você pode fazer isso no seu script MSBuild para o projeto particular em questão.

Por exemplo, colocar isso no final da sua .csproj arquivo:

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

Eu havn't tentei isso mesmo para levá-lo como uma sugestão amigável. Tente editar manualmente seu .csproj adicionando ou removendo o comentário do alvo BeforeBuild com um cortou inspirado a partir do seguinte:

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

I acha que não há tal maneira. Nome do conjunto de saída é estritamente fixado em Configurações do projeto:. uma montagem por um projetos

Além disso AssemblyAttributes lhe deram apenas indica propriedades visíveis de montagem (por exemplo, no Windows Explorer), não é nome de arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top