Как я могу создать разные библиотеки DLL в одном проекте? - PullRequest
3 голосов
/ 03 марта 2009

У меня есть вопрос, я не знаю, можно ли его решить. У меня есть один проект C # на Visual Studio 2005, и я хочу создать разные имена DLL в зависимости от константы препроцессора. В этот момент у меня есть константа препроцессора, два файла snk и два руководства по сборке. Я также создаю две конфигурации (Debug и Debug Preprocessor), и они прекрасно компилируются с использованием соответствующих snk и guid.

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

Теперь я должен поместить две сборки в GAC. Первая сборка добавляется без проблем, а вторая - нет.

Что можно сделать для создания двух или более разных сборок из одного проекта Visual Studio?

Возможно, я забыл включить новую строку в "AssemblyInfo.cs", чтобы изменить имя DLL в зависимости от константы препроцессора?

Ответы [ 4 ]

4 голосов
/ 03 марта 2009

Вот пример события после сборки:

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

Измените DebugOutput.dll и ReleaseOutput.dll на правильные имена файлов. Вы можете изменить "Debug" и "Release" для поддержки других конфигураций и добавить разделы для поддержки дополнительных конфигураций.


Этот скрипт создаст две библиотеки с разными именами файлов; чтобы создать два разных AssemblyNames, у вас есть два варианта.

Имя сборки создается следующим образом: :

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

Так что вам нужно либо изменить информацию о культуре, версию или строгое имя.

Два самых простых варианта:

  1. Изменить версию сборки:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. Изменить ключевой файл - создайте два ключевых файла с помощью инструмента sn и в AssemblyInfo.cs:

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

Обе эти опции приведут к двум разным сборкам, насколько GAC знает, поскольку он сравнивает полное имя сборки, а не «простое» имя.

3 голосов
/ 03 марта 2009

Visual Studio не позволяет выводить имена файлов для каждой конфигурации. Однако вы можете переименовать выходной файл как часть вашего сценария сборки. Вы можете сделать это в своем скрипте MSBuild для конкретного проекта.

Например, поместите это в конец вашего .csproj файла:

<Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
    <Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>
1 голос
/ 03 марта 2009

Я сам не пробовал, поэтому прими это как дружеское предложение. Попробуйте вручную отредактировать ваш .csproj, добавив или раскомментировав цель BeforeBuild с помощью фрагмента из следующего:

<Target Name="BeforeBuild">
    <AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>
0 голосов
/ 03 марта 2009

Я думаю, что такого пути нет. Имя выходной сборки строго фиксируется в настройках проекта: одна сборка на один проект.

Кроме того, атрибуты AssemblyAtributes, указанные вами, указывают только видимые свойства сборки (например, в проводнике Windows), но не имя файла.

...