Какой лучший способ настроить несколько версий платформы .NET?
Я создаю библиотеку классов, и я развожу его в пакет NuGet, который позволяет мне выбирать различные сборки, которые будут добавлены в качестве ссылок на основе .NET-версии проекта, к которой он добавлен. Это очень приятная функция, но мне интересно, возможно ли иметь один проект библиотеки классов и создать ее против многословных версий .NET framework?
Я бы предпочел избежать:
MyLibrary40.dll
и MyLibrary45.dll
если возможно, потому что двум проектам придется делиться большим количеством кода. Версия 4.5 будет предлагать функции async
, которая является функцией 4.5.
Кто-нибудь знает, какой лучший подход для этого? Могу ли я использовать несколько конфигураций сборки? Или я должен идти по отдельному маршруту проекта?
Если бы я работал на С++, я бы, вероятно, использовал несколько конфигураций и #if
блоки вокруг функций, которые поддерживаются только в одной конфигурации, но я беспокоюсь, что это приведет к тому, что у меня будут две сборки с тем же именем, которые делают разные вещи.
Спасибо заранее!
Ответы
Ответ 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
Старый вопрос, который я знаю, и в то время это был не подходящий ответ... но теперь можно использовать общий проект, который логически совпадает с добавлением проекта как ссылки, а не каждого файла в отдельности.