En utilisant MSBuild pour créer des projet Visual Studio j'obtiens un comportement bizarre. Sur n'importe quel projet csproj ou vbproj de Visual Studio 2005, mon code marche nikel, mais avec n'importe quel projet Visual Studio 2008, j'obtiens ceci :
Microsoft.Build.BuildEngine.InvalidProjectFileException: Le projet importé "C:\Microsoft.CSharp.targets" est introuvable. Vérifiez que le chemin d'accès dans la déclaration <Import> est correct et que le fichier existe sur le disque. C:\blabla\WpfApplication1.csproj
à Microsoft.Build.Shared.ProjectErrorUtilities.ThrowInvalidProject(String errorSubCategoryResourceName, XmlNode xmlNode, String resourceName, Object[] args)
à Microsoft.Build.Shared.ProjectErrorUtilities.VerifyThrowInvalidProject(Boolean condition, String errorSubCategoryResourceName, XmlNode xmlNode, String resourceName, Object arg0)
à Microsoft.Build.BuildEngine.Project.LoadImportedProject(Import import)
à Microsoft.Build.BuildEngine.Project.ProcessImportElement(XmlElement importElement, Boolean importedProject)
à Microsoft.Build.BuildEngine.Project.ProcessProjectChildren(XmlElement projectElement, Boolean importedProject)
à Microsoft.Build.BuildEngine.Project.ProcessMainProjectElement()
à Microsoft.Build.BuildEngine.Project.RefreshProjectIfDirty()
à Microsoft.Build.BuildEngine.Project.InternalLoadFromXmlDocument(XmlDocument projectXml)
à Microsoft.Build.BuildEngine.Project.Load(String projectFileName)
à VS2005ImportWizard.VSProjectWizardPlugin.ParseVSSolution(CInstallerProject generated_project, String project_path, Dictionary`2 properties) dans C:\blabla\VSProjectWizardPlugin.cs:ligne 147
etc..
le code de ParseVSSolution est celui ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Project vs_project = new Project(InstanceEngine);
 
            vs_project.Load(project_path); <- crash, project_path est un projet VS 2008
            blabla ...
Project est un projet MSBuild, et enfin, InstanceEngine est l'engine MSBuild crée comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
instanceEngine = new Engine(RuntimeEnvironment.GetRuntimeDirectory());
j'ai raté quelle marche ?