2010-12-10 17 views
14

¿Existe alguna forma de que se pueda agregar una referencia a una solución mediante programación?C# Visual Studio ... agregar referencias mediante programación

Tengo un botón de complemento, cuando el usuario lo presiona, quiero que se agregue una referencia. es posible?

+1

¿Qué tipo de aplicación está en desarrollo que requiere esto? – Bernard

+0

¿Está interesado en saber si esto es posible o en _how_ para lograrlo? – Oded

+0

Es posible. Lo he hecho antes. No recuerdo el código que solía hacerlo, aunque – scott

Respuesta

6

Algo como esto no lo he probado

llegar el medio ambiente

EnvDTE80.DTE2 pEnv = null; 
Type myType = Type.GetTypeFromProgID("VisualStudio.DTE.8.0");   
pEnv = (EnvDTE80.DTE2)Activator.CreateInstance(myType, true); 

obtener la solución.

Solution2 pSolution = (Solution2)pEnv.VS.Solution; 

obtener el proyecto que desea

Project pProject = pSolution.Projects[0]; 

agregar la referencia

pProject.References.Add(string referenceFilePath); 
1

System.Assembly.load Le permite llamar a funciones en una biblioteca que no fueron creadas con su programa.


Si desea agregar una referencia al proyecto para que esté en la solución, puede usar lo siguiente. Básicamente lo mismo que @Scots responder.

lo hice en una macro que es vb pero estoy seguro de que usted puede conseguir la idea

DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
    Dim objProject As EnvDTE.Project 
    Dim i As Long 
    i = DTE.Solution.Projects.Count 
    For Each objProject In DTE.Solution.Projects 
     If (objProject.Name() = "csCA") Then 
      Dim vsproj As VSLangProj.VSProject 
      vsproj = objProject.Object 
      vsproj.References.Add("C:\Users\test.dll") 
     End If 
    Next 
+0

¿Por qué el voto abajo? Es exactamente *** cómo cargar plugins sin utilizar bibliotecas de terceros. 'Assembly.Load' y luego' Activator.CreateInstance' – jgauffin

+2

Esto no agregará la referencia a la solución, simplemente cargará un 'Assembly' para el código en ejecución. –

+0

¡Algunas personas son simplemente raras! Lo he subido de categoría, gracias por la respuesta. –

2

Hay un ejemplo en CodeProject.

La funcionalidad está contenida en una sola clase elRefManager y el método para llamar es CheckReferences. El código se puede ver en here seleccionando el archivo elRefManager.cs en el lado izquierdo.

Como se ve en el artículo que podría hacer ...

private void button1_Click(object sender, System.EventArgs e) 
{ 
    int ec; 
    ec=elRefManager.CheckReferences(null, new string[] {textBox1.Text}); 

    if (ec<0) 
     MessageBox.Show("An error occurred adding this reference"); 
    if (ec>0) 
     MessageBox.Show("Could not add " + textBox1.Text + 
        "\nCheck its spelling and try again"); 
} 
+0

Esto está directamente relacionado con lo que Darren está pidiendo. Él está preguntando cómo agregar una referencia a un proyecto programáticamente a partir de un * add-in * lo que significa que tiene acceso a la instancia DEV/solución/proyecto del sistema. Él * * no * pregunta cómo cargar un ensamblaje dinámicamente en tiempo de ejecución. – casperOne

+0

Diré que debe indicar en qué parte del artículo Darren puede ver el código para descubrir cómo integrarlo en su complemento (este es un programa externo que accede a la tabla de objetos en ejecución y luego interactúa con las mismas interfaces y agrega -in lo haría). – casperOne

+0

@casperOne Actualizado en consecuencia ... –

Cuestiones relacionadas