Программно изменять файлы .csproj

#xml #visual-studio-2010 #projects-and-solutions #linq-to-xml #csproj

#xml #visual-studio-2010 #проекты и решения #linq-to-xml #csproj

Вопрос:

У меня есть исходный код Entlib 5.0, и мне нужно подписать все сборки, используя мой собственный ключ (файл snk).

Проще всего было бы открыть файл решения EnterpriseLibrary.2010 в Visual Studio 2010 и для каждого проекта выбрать Свойства-> Подписание, затем выбрать Подписать сборку и, наконец, выбрать ключевой файл.

Но я не хочу делать это вручную, тогда я мог бы написать скрипт для ручного редактирования файлов проекта и вставить следующее в конец текущего списка PropertyGroups :

 <PropertyGroup>
    <SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
    <AssemblyOriginatorKeyFile>keyFile.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
  

Любой вспомогательный класс на C # или скриптинг, если бы было лучше сделать это простым и быстрым способом?

Комментарии:

1. Почему бы не написать программу на C #, использующую класс XDocument ?

Ответ №1:

Вы можете взглянуть на Microsoft.Build.Ссылка на MSDN пространства имен BuildEngine

Пример кода:

 Engine eng = new Engine()
Project proj = new Project(eng);
proj.Load(FullProjectPath);
proj.SetProperty("SignAssembly", "true");
proj.Save(FullProjectPath);
  

Недавно я использовал нечто подобное, чтобы внести ряд изменений во все файлы .csproj моей компании (более 200) вместо того, чтобы вручную открывать каждый проект и вносить изменения.

Надеюсь, это поможет.

Комментарии:

1. конечно, когда я использовал его, я написал консольное приложение, которое просматривало наш исходный каталог и собирало все файлы .csproj, а затем вносило необходимые изменения. Вам просто нужно добавить ссылку на Microsoft.Build. Движок и Microsoft.Build. Фреймворк

2. Знаете ли вы, доступна ли часть csproj «Событие после сборки» через эту библиотеку? Я немного порылся. Но пока не нашел его. Спасибо. И «Проголосовать» за этот ответ.

3. конечно, вы должны быть в состоянии сделать что-то вроде Target postBuild = proj . Цели [«AfterBuild»]; предполагая, что это не было прокомментировано в файле проекта. Я копался около 5 секунд и не видел, как добавить цель, если она не существует, но я знаю, что это можно сделать. Кроме того, это пространство имен устарело, и вам может повезти с его заменой.

4. Движок устарел, и люди должны использовать Microsoft.Build. Оценка… единственная проблема с оценкой — это целевая платформа. Если вы используете .netstandard, он будет нацелен на более старую платформу, которая может выдавать ошибки. Единственное решение — использовать средство чтения и записи xml.

5. Microsoft.Build. Движок не работает и Microsoft.Build. Оценка отсутствует. Любая другая библиотека для настройки движка и объекта проекта?

Ответ №2:

Как некоторые отметили, другой ответ, что движок теперь устарел, и люди должны использовать Microsoft.Build.Оценка однако оценка, если вы используете .netstandard, будет нацелена на более старую платформу, которая может выдавать ошибки.

Другой вариант — вызвать этот инструмент dotnet:

https://www.nuget.org/packages/dotnet-property

 dotnet property "**/Project.csproj" AssemblyOriginatorKeyFile:"keyFile.snk"
  

Последним вариантом было бы сделать это во время сборки (без инструмента)

 dotnet build /p:AssemblyOriginatorKeyFile=keyFile.snk