MSBuild, использующий BuildManager, не может найти путь начальной загрузки или SignTool.exe

Я пытаюсь автоматизировать сборку с использованием MSBuild API - "BuildManager".

Следующий код отлично работает для построения решений / проектов, но не работает, когда дело доходит до публикации. Проект очень хорошо публикуется при использовании страницы публикации Visual Studio.

            var collection = new ProjectCollection();
            var parameters = new BuildParameters(collection);
            parameters.Loggers = new List<ILogger> { Logger };
            parameters.MaxNodeCount = Environment.ProcessorCount; //maxcpucount


            var globalProperties = new Dictionary<string, string>();
            globalProperties.Add("Configuration", "Debug"); 
            globalProperties.Add("Platform", "AnyCPU");
            globalProperties.Add("OutDir", binPath);
            globalProperties.Add("OutputPath", publishPath);
            globalProperties.Add("ApplicationVersion", version.ToString());
            globalProperties.Add("GenerateBootstrapperSdkPath", @"C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\");

            //Doesn't work!
            globalProperties.Add("SignToolPath", @"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe");

            BuildManager.DefaultBuildManager.ResetCaches();

            var buildRequest = new BuildRequestData(projectFile.FileInfo.FullName, globalProperties, "4.0", new[] { "Rebuild", "Publish" }, null);

            var buildResult = BuildManager.DefaultBuildManager.Build(parameters, buildRequest);

Если я запускаю этот код, он завершается со следующей ошибкой:

Произошла ошибка при подписании: SignTool.exe не найден.

Как вы можете видеть, я добавляю глобальное свойство "GenerateBootstrapperSdkPath", которое, если его нет, приводит к этой ошибке:

Не удалось найти требуемый файл "setup.bin" в "C:\PathToProject\Engine".

Кажется, что это порочный цикл, как только я указываю путь для загрузчика, он не может найти SignTool.exe, если я не могу найти setup.bin.

К сожалению, глобальное свойство SignToolPath, похоже, ничего не делает.

Есть идеи?

1 ответ

Решение

Существовала старая проблема с поиском загрузчика в MSBuild, которая могла быть решена путем создания раздела реестра:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\4.0]
@="0"
"Path"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bootstrapper\\" 

Просто установите его в вашу версию SDK и попробуйте снова. Или, возможно, используйте путь к вашему загрузчику в коде BuildManager на основе приведенного выше вместо:

C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\

Согласно одной из старых записей в блоге, следующие значения реестра разрешаются при поиске пути начальной загрузки, и, наконец, проверяется ваша локальная папка проекта в подпапке Engine, а когда MSBuild не найден, выдает ошибку MSB3147:

HKLM\Software\Microsoft\GenericBootstrapper\<.NET Tools Version>\
HKLM \Software\Microsoft.NetFramework\SDKInstallRoot\Bootstrapper
HKLM \Software\Microsoft\VisualStudio\\InstallDir\Bootstrapper

Сборка команды для приложения ClickOnce с загрузчиком

Из вашего описания я понимаю, что поиск решения для местоположения загрузчика решит вашу проблему, поскольку в этой конфигурации вы не наблюдали никаких проблем SignTool.exe.

Другие вопросы по тегам