Подтвердить что ты не робот

Какой лучший способ настроить несколько версий платформы .NET?

Я создаю библиотеку классов, и я развожу его в пакет NuGet, который позволяет мне выбирать различные сборки, которые будут добавлены в качестве ссылок на основе .NET-версии проекта, к которой он добавлен. Это очень приятная функция, но мне интересно, возможно ли иметь один проект библиотеки классов и создать ее против многословных версий .NET framework?

Я бы предпочел избежать:

MyLibrary40.dll и MyLibrary45.dll

если возможно, потому что двум проектам придется делиться большим количеством кода. Версия 4.5 будет предлагать функции async, которая является функцией 4.5.

Кто-нибудь знает, какой лучший подход для этого? Могу ли я использовать несколько конфигураций сборки? Или я должен идти по отдельному маршруту проекта?

Если бы я работал на С++, я бы, вероятно, использовал несколько конфигураций и #if блоки вокруг функций, которые поддерживаются только в одной конфигурации, но я беспокоюсь, что это приведет к тому, что у меня будут две сборки с тем же именем, которые делают разные вещи.

Спасибо заранее!

4b9b3361

Ответ 1

Вам понадобится хотя бы один VisualStudio Solution с двумя проектами (один для .net 4 и один для .net 4.5).

Добавьте все файлы кода в .net 4-проект, а в другом проекте вы добавите файлы кода в качестве ссылки (используйте "Add Existing Item..." -Dialog и выберите Add as link)

Теперь вы добавляете все коды и классы для .NET 4.5 в ваш 4.5-проект.

Кроме того, вы должны определить свои собственные ключи компилятора (условные символы компиляции) для своих проектов. Как NET4 для вашего .net 4-проекта и NET4.5 для вашего .net-проекта 4.5.

Вы устанавливаете переключатели в настройках проекта в разделе Build- > General- > Conditional Compilation Switches

В вашем коде вы можете использовать следующие коммутаторы для генерации кода для .NET 4 или .NET 4.5

#if NET4
  // code only for .NET 4
#endif

// code for all framework versions.

#if NET45
  // code only for .NET 4.5
#endif

Ответ 2

Простой подход состоит в том, чтобы добавить еще один файл .csproj в ту же папку и настроить его для создания другой версии фреймворка. Это позволяет избежать добавления ссылок на файлы, поскольку оба проекта по существу представляют одну и ту же структуру папок.

Скажите, что у вас есть структура:

- MyLibrary\
  - MyLibrary.sln
  - MyLibrary\
    - MyLibrary.csproj
    - Program.cs

Дублируйте MyLibrary.csproj в ту же папку и отредактируйте, чтобы изменить несколько вещей:

  • <ProjectGuid> просто введите новый идентификатор GUID для этого значения элемента
  • <TargetFrameworkVersion> укажите альтернативную версию здесь, например: v4.5 или v3.5
  • <OutputPath> (для Debug и Release) установите для этого уникального пути, например bin\Debug\net45 и bin\Debug\net45, чтобы каждый выход проекта заканчивался в уникальном месте

Вы также должны добавить новый элемент к не условному элементу <PropertyGroup>, чтобы два проекта не сталкивались в папке obj во время параллельных сборок. Это важно и защищает от странных ошибок состояния гонки.

<PropertyGroup>
  <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>

Наконец, добавьте этот новый проект в существующее решение.

Этот подход работает рука об руку с определением компиляционных переключателей, таких как NET35 и NET45, и с помощью директив #if NET35/#endif.

Два проекта с открытым исходным кодом, которые используют этот метод, MetadataExtractor и NetMQ. Вы можете обратиться к ним, если вы столкнулись с проблемой.

Ответ 3

Старый вопрос, который я знаю, и в то время это был не подходящий ответ... но теперь можно использовать общий проект, который логически совпадает с добавлением проекта как ссылки, а не каждого файла в отдельности.