Estoy escribiendo una extensión de Visual Studio y me gustaría cambiar la ruta de sugerencia de una referencia de ensamblaje de un proyecto de C # sin activar el diálogo "Modificación de archivo detectado".

<Reference Include="SomeAssembly">
  <HintPath>C:\ChangeMe\SomeAssembly.dll</HintPath>
</Reference>

Pero en la interfaz VSLangProj110.Reference5 no puedo encontrar ninguna propiedad que pueda usar. (Acceso a través de VSLangProj140.VSProject3.References)

2
Thoenissen 1 abr. 2017 a las 23:06

2 respuestas

La mejor respuesta

Microsoft.Build.BuildEngine.Project está desactualizado. Aquí hay una solución de trabajo actualizada.

foreach (var dteProject in dte.Solution.Projects.OfType<Project>())
{
    // You can edit the project through an object of Microsoft.Build.Evaluation.Project 
    var buildProject = ProjectCollection.GlobalProjectCollection.GetLoadedProjects(dteProject.FullName).First();
    foreach (var item in buildProject.Items.Where(obj => obj.ItemType == "Reference"))
    {
        var newPath = SomeMethod(item.GetMetadata("HintPath"));

        item.SetMetadataValue("HintPath", newPath);
    }

    // But you have to save through an object of EnvDTE.Project
    dteProject.Save();
}
1
Thoenissen 1 may. 2017 a las 12:53

Creo una demostración y reproduzco su problema de mi parte. Creo que es un problema de diseño, si modifica el proyecto fuera del entorno, aparecerá el cuadro de diálogo "Se detectó modificación de archivo", debemos cambiarlo manualmente.

Puede publicar un comentario en el siguiente enlace: https://connect.microsoft.com/VisualStudio/Feedback

Actualizar:

DTE2 dte = (DTE2)this.ServiceProvider.GetService(typeof(DTE));
            EnvDTE.Project currentProject = dte.Solution.Projects.Item(1);

            // Create a new Project object.
            Microsoft.Build.BuildEngine.Project project = new Microsoft.Build.BuildEngine.Project();

            project.Load(currentProject.FullName);

            foreach (BuildItemGroup ig in project.ItemGroups)
            {
                //var items = ig.ToArray();

                foreach (BuildItem item in ig.ToArray())
                {
                    if (item.Include == "ClassLibrary1")
                    {
                        item.Include = "Utils";
                        item.SetMetadata("HintPath", @"C:\relativePath\Utils.dll");
                    }
                }
            }
            project.Save(currentProject.FullName);
0
Zhanglong Wu - MSFT 4 abr. 2017 a las 01:51