IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

[MSBuild] Microsoft.Build.BuildEngine.InvalidProjectFileException :


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut [MSBuild] Microsoft.Build.BuildEngine.InvalidProjectFileException :


    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 ?

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Me suis encore débrouillé tout seul ...
    Solution (magouille) :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    /* il faut obtenir d'abord la version du projet */
                XmlDocument x_project = new XmlDocument();
                x_project.Load(project_path);
                string version_str = null;
     
                {
                    XmlNode project_node = null;
     
                    foreach (XmlNode node in x_project.ChildNodes)
                    {
                        if (node.Name.Equals("Project", StringComparison.OrdinalIgnoreCase))
                        {
                            project_node = node;
                            break;
                        }
                    }
     
                    if (project_node == null)
                        throw new InvalidProjectFileException(String.Format("Le fichier {0} ne comporte pas de balise 'Project' racine"));
     
                    foreach (XmlAttribute att in project_node.Attributes)
                    {
                        if (att.Name != null && att.Name.Equals("ToolsVersion", StringComparison.OrdinalIgnoreCase))
                        {
                            version_str = att.Value;
                            break;
                        }
                    }
     
                    if(version_str == null || version_str == "")
                        version_str = "2.0";
                }
     
                /* On a obtenu la version, on lit le dossier Bin */
                const string reg_root = @"SOFTWARE\Microsoft\MSBuild\ToolsVersions\";
     
                using (RegistryKey ms_build_key = Registry.LocalMachine.OpenSubKey(reg_root + version_str))
                {
                    if (ms_build_key == null)
                    {
                        throw new InvalidProjectFileException(String.Format("La valeur de ToolsVersion, {0}, n'est pas reconnue", version_str));
                    }
                    else
                    {
                        InstanceEngine.BinPath = (string)ms_build_key.GetValue("MSBuildToolsPath");
                    }
                }
     
                Project vs_project = new Project(InstanceEngine);
     
                /* Je n'ai pas trouvé le moyen de lui dire que les deux variables suivantes devaient être
                * un truc bien, ce c* s'obstine à dire que c'est "C:\" donc je remplace à la main ... -_-"
                */
                vs_project.LoadXml(x_project.InnerXml.Replace("$(MSBuildBinPath)", InstanceEngine.BinPath).Replace("$(MSBuildToolsPath)", InstanceEngine.BinPath));
     
                vs_project.FullFileName = project_path;
                //vs_project.Load(project_path);
                ParseVSSolution(generated_project, vs_project, properties);

    ça marche ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/05/2015, 23h20
  2. Réponses: 0
    Dernier message: 19/03/2015, 14h49
  3. Réponses: 0
    Dernier message: 27/03/2012, 21h41
  4. Microsoft.Build.Engine introuvable lors de l'ouverture de mon projet
    Par Nanos dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 25/04/2010, 20h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo