2017-10-17 3 views
0

Je suis en train de créer un script MSBuild personnalisé en C#, en utilisant l'API Microsoft.Build.Evaluation plus récente. Le problème que j'ai est que cette nouvelle API ne supporte pas les fichiers .sln. L'ancienne API obsolète Microsoft.Build.Engine supporte les fichiers .sln, mais je voudrais utiliser la plus récente car 1) elle n'est pas obsolète et 2) il semble y avoir plus de documentation en ligne et d'utilisation à faire référence. J'ai vu que MSBuild peut créer un fichier .metaproj lors de la compilation réussie d'une solution, lorsque cette affectation est faite dans CMD: set MSBuildEmitSolution=1. J'ai besoin du fichier .metaproj pour pouvoir compiler la solution en premier lieu. Y a-t-il quelque chose dans l'API pour convertir .sln en .metaproj? Existe-t-il une bibliothèque pour analyser les fichiers .sln?Comment puis-je utiliser un fichier SLN avec MSBuild par programmation à partir de C#?

+0

Voulez-vous dire l'API 'Microsoft.Build.BuildEngine' ne supporte les fichiers .sln? Si ce n'est pas le cas, vous pouvez utiliser l'API 'Microsoft.Build.BuildEngine' pour créer un fichier sln par programmation: https://stackoverflow.com/questions/6511380/how-do-i-build-a-solution-programmatically-in-c. En outre, la version .NET 4.0 de l'assembly Microsoft.Build contient une classe SolutionParser dans l'espace de noms Microsoft.Build.Construction qui analyse les fichiers de la solution Visual Studio. https://stackoverflow.com/questions/707107/parsing-visual-studio-solution-files. –

Répondre

0

Je l'ai compris après plus de recherche. Trouver de bons exemples en ligne est un peu difficile en raison des deux versions différentes de l'API MSBuild, et de la popularité de simplement exécuter MSBuild depuis la ligne de commande.

Voici le code qui travaille maintenant pour moi, en utilisant la nouvelle API MSBuild:

var pc = new ProjectCollection(); 

var parameters = new BuildParameters(pc) 
{ 
    Loggers = new[] { _logger } //Instance of ILogger instantiated earlier 
}; 

var request = new BuildRequestData(
    projectFullPath: pathToMySlnFile, //Solution file path 
    globalProperties: myPropertyDictionary, 
    toolsVersion: null, 
    targetsToBuild: myTargetsArray, 
    hostServices: null, 
    flags: BuildRequestDataFlags.ProvideProjectStateAfterBuild); 

var buildResult = BuildManager.DefaultBuildManager.Build(parameters, request); 
+0

merci de partager votre solution ici, vous pouvez le marquer comme la réponse, de sorte qu'il pourrait aider d'autres membres de la communauté qui obtiennent les mêmes problèmes. –

+0

@ Leo-MSFT En fait, je vois maintenant un comportement très étrange, et je voyais une partie de ce qui précède, c'est pourquoi j'ai confirmé votre solution, puis non confirmée une fois. Si je cours dans le débogueur avec ce chemin ajouté en tant que propriété, cela fonctionne, mais il échouera à trouver le fichier cible correct lorsqu'il n'est pas dans le débogueur. Si je supprime la propriété path, l'inverse est vrai. Quand il échoue avec le chemin ajouté en dehors du débogueur, il cherche dans le répertoire spécifié pour v14. Les packages Microsoft.Build n'ont pas encore de v15. Peut-être que cela en fait partie – JamesFaix