Как я могу создавать разные библиотеки DLL в одном проекте?
-
03-07-2019 - |
Вопрос
У меня есть вопрос, я не знаю, можно ли его решить.У меня есть один проект C # в Visual Studio 2005, и я хочу создать разные имена DLL в зависимости от константы препроцессора.На данный момент у меня есть константа препроцессора, два файла snk и guid двух сборок.Я также создаю две конфигурации (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 в зависимости от константы препроцессора?
Решение
Вот пример события после сборки:
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"
для поддержки других конфигураций и добавления разделов для поддержки большего количества конфигураций.
Этот скрипт создаст две библиотеки dll с разными именами файлов;чтобы создать два разных имени сборки, у вас есть два варианта.
Имя сборки строится следующим образом следует:
Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'
Таким образом, вам нужно либо изменить информацию о культуре, версию, либо строгое имя.
Двумя простейшими вариантами являются:
Измените версию сборки:
#if SOME_COMPILER_SYMBOL [assembly: AssemblyVersion("1.0.0.0")] #else [assembly: AssemblyVersion("1.0.0.1")] #endif
Измените ключевой файл - создайте два ключевых файла с
sn
инструмент, и вAssemblyInfo.cs
:#if SOME_COMPILER_SYMBOL [assembly: AssemblyKeyFile("FirstKey.snk")] #else [assembly: AssemblyKeyFile("SecondKey.snk")] #endif
Оба этих параметра приведут к созданию двух разных сборок, насколько известно GAC, поскольку он сравнивает полное имя сборки, а не "простое" имя.
Другие советы
Visual Studio не разрешает указывать имена выходных файлов для каждой конфигурации.Однако вы могли бы переименовать выходной файл как часть вашего сценария сборки.Вы могли бы сделать это в своем скрипте MSBuild для конкретного проекта, о котором идет речь.
Например, поместите это в конце вашего .csproj файл:
<Target Name="AfterBuild">
<Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
<Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>
Я сам этого не пробовал, так что примите это как дружеское предложение.Попробуйте вручную отредактировать ваш файл .csproj, добавив или раскомментировав цель BeforeBuild с помощью сокращенного текста, вдохновленного следующим:
<Target Name="BeforeBuild">
<AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
<AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>
Я думаю, что такого способа нет.Название выходной сборки строго фиксировано в настройках проекта:одна сборка на один проект.
Кроме того, указанные вами атрибуты AssemblyAttributes указывают только видимые свойства сборки (например, в проводнике Windows), а не имя файла.