Может ли MSBuild (через пространство имен Microsoft.Build) загрузить проект из памяти?

Я работаю над службой, которая загружает решение .NET из репозитория и создает его (мало чем отличается от службы сборки с непрерывной интеграцией). Я хочу знать, используя MSBuild программно через классы пространства имен Microsoft.Build, могу ли я загрузить решение и проект(ы) в память и построить их без предварительного сохранения их на диск во временной папке?

Я все еще изучаю MSBuild и пробую что-то, но я полагаю, что кто-то из Stack Overflow пробовал это и имеет некоторое представление.


person Adam Maras    schedule 19.10.2012    source источник


Ответы (2)


Я не могу сказать, хорошая это идея или нет, но это возможно сделать.

ProjectInstance имеет конструктор, который принимает ProjectRootElement, который можно создать с помощью Создать метод (XmlReader). И, как вы, возможно, знаете, XmlReader может быть присоединен к различным потокам, включая MemoryStream.

Вот как это может выглядеть:

var xmlReader = XmlTextReader.Create([your existing memory stream]);
var project = ProjectRootElement.Create(xmlReader);

var buildParams = new BuildParameters();
var buildData = new BuildRequestData(new ProjectInstance(project),
    new string[] { "Build", "Your Other Target Here" });

var buildResult = BuildManager.DefaultBuildManager.Build(buildParams, buildData);
person Rafael Rivera    schedule 19.10.2012
comment
+1 только потому, что вы решили первую половину проблемы. Вторая половина будет фактическими файлами кода с проектами, которые должны быть скомпилированы/связаны/связаны с ресурсами/и т. д. Есть ли способ разрешить их вручную вместо того, чтобы инструменты искали их на диске? - person Adam Maras; 20.10.2012
comment
Да, я только что понял, что фактические ресурсы, связанные с проектом, все еще будут на диске... хм. - person Rafael Rivera; 20.10.2012
comment
Возможно, один из способов атаковать это — иметь общую сетевую папку (доступную только для чтения?), на которую могут ссылаться файлы проекта. - person Rafael Rivera; 20.10.2012
comment
Не совсем соответствует моей архитектуре. Я думаю, мне нужно покопаться в Reflector и посмотреть, что именно происходит под капотом. Возможно, я смогу сделать что-то похожее на пользовательскую регистрацию URI в качестве корневого каталога, чтобы иметь возможность загружать файлы с пользовательский код. - person Adam Maras; 20.10.2012
comment
@AdamMaras, если честно, это прекрасно отвечает на ваш вопрос, вы не упомянули, что у вас есть дополнительные требования к расположению исходных файлов. - person skolima; 20.10.2012

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

person Adam Maras    schedule 01.11.2012