Я понимаю, что это довольно общий вопрос, но мне не удалось найти надежный ресурс по решению следующего сценария, и он не был в одном месте. Поэтому я решил спросить здесь в надежде помочь другим, борющимся с той же проблемой:
Как разработчик компонентов .NET я хочу поддерживать широкий спектр целевых платформ .NET. Эта тема стала для меня очень важной в связи с недавним взрывом вариантов целевой платформы, когда были представлены ядро dot net и стандарт dot net.
Итак, представьте, что я пишу библиотеку C# MyLib
(которую я бы назвал «продуктом»), которая компилируется в файл MyLib.dll
. Я хочу поддерживать различные диапазоны целевых платформ: net35
, net40
, net45
, netstandard1.2
и т. д. Поэтому я создаю сборки (файлы MSBuild или csproj) для каждой целевой платформы и объединяю их вместе в один пакет nuget, соблюдая рекомендации Nuget по структуре папок lib. Таким образом, продукт можно получить из одного артефакта сборки — пакета nuget.
Для каждой целевой версии фреймворка я стараюсь использовать ее функции и преимущества и предоставлять полные заполнения для более низких версий или удалять некоторые функции. В общем, дело в том, что «продукт» можно использовать независимо от целевой структуры проекта-потребителя - я имею в виду, что пакет nuget для MyLib
должен быть установлен правильно, и следует ссылаться на соответствующую dll.
Итак, возникает несколько вопросов:
- Правильно ли использовать одну и ту же информацию о версии сборки для разных сборок? Как повторное использование одного и того же файла
AssemblyInfo.cs
? - Какие атрибуты сборки не должны быть общими для моих сборок? Я начал другой поток в отношении атрибута
[assembly: Guid("...")]
]. Другие люди также отображают проблемы атрибута[assembly: AssemblyTitle("...")]
, но в другом контекст. - Есть ли хороший или стандартизированный подход к организации решения для поддержки описанного выше результата сборки. Действительно ли большинство проектов действительно заботятся о себе в достижении этого?
Мой собственный путь до сих пор состоит в том, чтобы использовать отдельный файл .csproj для каждой целевой платформы для одного и того же «продукта», но по мере развития разработки может стать утомительным поддерживать несколько проектов, даже если количество целевых платформ сейчас довольно значительно.