2017-10-23 2 views
1

Ich versuche, Builds mit der MSBuild-API zu automatisieren - "BuildManager".MSBuild mit BuildManager kann Bootstrapperpfad oder SignTool.exe nicht finden

Der folgende Code funktioniert gut für das Erstellen von Lösungen/Projekten, schlägt jedoch fehl, wenn es um das Veröffentlichen geht. Das Projekt wird ordnungsgemäß veröffentlicht, wenn die Visual Studio-Veröffentlichungsseite verwendet wird.

  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); 

Wenn ich diesen Code ausführen, schlägt es mit dem folgenden Fehler:

An error occurred while signing: SignTool.exe not found.

Wie Sie sehen, ich hinzufüge, die globale Eigenschaft namens „GenerateBootstrapperSdkPath“, die, wenn ihr nicht dort führt zu dieser Fehler:

Could not find required file 'setup.bin' in 'C:\PathToProject\Engine'.

Dies scheint ein Teufelskreis, so schnell zu sein, wie ich einen Weg für das Bootstrap-Programm angeben, es kann die SignTool.exe nicht finden, wenn ich es nicht, kann nicht das finden setup.bin.

Leider scheint die globale Eigenschaft "SignToolPath" nichts zu tun.

Irgendwelche Ideen?

+0

Und in der Zwischenzeit, vernünftige Verwendung von if (File.Exists (....)) wäre gut vor dem Pflügen blind voraus unter der Annahme, dass verschiedene absolute Pfade existieren. –

Antwort

1

Es war ein altes Problem der Bootstrap von MSBuild Ortung, die durch die Schaffung von Registrierungsschlüsseln gelöst werden könnte:

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

Gerade stellt es wieder auf Ihre SDK-Version und versucht. Oder vielleicht den Pfad zu Ihrem Bootstrap in Buildmanager Code verwenden, basierend auf dem oben eine statt:

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

Gemäß einem alten Blog-Einträge die folgenden Registrierungswerte auf der Suche aufgelöst werden für den Bootstrap-Pfad und schließlich Ihr lokales Projekt Ordner unter dem Motorunterverzeichnis wird überprüft und wenn nicht MSB3147 Fehler MSBuild wirft gefunden:

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

Team build for ClickOnce application with bootstrapper

ich aus Ihrer Beschreibung verstehen, die Lösung zu finden, um bootstrapp Der Speicherort würde Ihr Problem lösen, da Sie in dieser Konfiguration keine SignTool.exe-Probleme beobachten konnten.

+0

Danke, Sie haben Recht, es hat mit fehlerhaften Registrierungsschlüsseln oder nicht vorhandenen SDKs zu tun, auf die sie verweisen. – MemphiZ

Verwandte Themen