Como posso criar diferentes DLLs em um projeto?
-
03-07-2019 - |
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?
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:
-
Alterar a versão do assembly:
#if SOME_COMPILER_SYMBOL [assembly: AssemblyVersion("1.0.0.0")] #else [assembly: AssemblyVersion("1.0.0.1")] #endif
-
Alterar o keyfile - criar dois keyfiles com a ferramenta
sn
, e emAssemblyInfo.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.