Вопрос

У меня есть вопрос, я не знаю, можно ли его решить.У меня есть один проект 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'

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

Двумя простейшими вариантами являются:

  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, поскольку он сравнивает полное имя сборки, а не "простое" имя.

Другие советы

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), а не имя файла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top