2010-12-10 40 views
14

Est-il possible qu'une référence puisse être ajoutée à une solution par programmation?C# Visual Studio ... ajouter des références par programme

J'ai un bouton de complément, lorsque l'utilisateur appuie dessus, je veux ajouter une référence. Est-ce possible?

+1

Quel type d'application vous développez ce qui exige? – Bernard

+0

Etes-vous intéressé de savoir si cela est possible, ou dans _how_ pour y parvenir? – Oded

+0

C'est possible. Je l'ai déjà fait. Je ne me souviens pas du code que j'ai utilisé pour le faire. – scott

Répondre

6

Quelque chose comme ça, je ne l'ai pas testé

obtenir l'environnement

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

obtenir la solution.

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

obtenir le projet que vous voulez

Project pProject = pSolution.Projects[0]; 

ajouter la référence

pProject.References.Add(string referenceFilePath); 
1

System.Assembly.load Vous permet d'appeler des fonctions dans une bibliothèque qui n'ont pas été créées avec votre programme.


Si vous souhaitez ajouter une référence au projet afin qu'il soit dans la solution, vous pouvez utiliser ce qui suit. Fondamentalement la même chose que @Scots réponse.

je l'ai fait dans une macro qui est vb mais je suis sûr que vous pouvez obtenir l'idée

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

Pourquoi le vote baissier ?? C'est *** exactement *** comment vous chargez les plugins sans utiliser de bibliothèques tierces. 'Assembly.Load', puis' Activator.CreateInstance' – jgauffin

+2

Cela n'ajoutera pas la référence à la solution, il chargera simplement un 'Assembly' pour le code courant. –

+0

Certaines personnes sont juste bizarres! Je l'ai upvoted- merci pour la réponse. –

2

Il y a un exemple sur CodeProject. La fonctionnalité est contenue dans une classe unique elRefManager et la méthode à appeler est CheckReferences. Le code peut être regardé here en sélectionnant le fichier elRefManager.cs sur le côté gauche.

Comme on le voit dans l'article que vous pourriez faire ...

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

Ceci est directement lié à ce que demande Darren. Il demande comment ajouter une référence à un projet par programmation à partir d'un * add-in *, ce qui signifie qu'il a accès au système DEV instance/solution/project. Il ne * demande * pas comment charger un assembly dynamiquement au moment de l'exécution. – casperOne

+0

Je dirais que vous devriez indiquer où dans l'article Darren peut regarder le code pour comprendre comment l'intégrer dans son add-in (il s'agit d'un programme externe qui accède à la table des objets en cours d'exécution et interfacé avec les mêmes interfaces -in serait). – casperOne

+0

@casperOne Mis à jour en conséquence ... –