Freigeben über


Gewusst wie: Bearbeiten von Visual Basic- und C#-Projekten mit dem VSProject2-Objekt

Aktualisiert: November 2007

Die VSProject2-Schnittstelle bietet Zugriff auf Methoden und Eigenschaften, die für Visual C#-, Visual Basic- und Visual J#-Projekte spezifisch sind. VSProject2 bietet zudem über die DTE-Eigenschaft und die Project-Eigenschaft Zugriff auf das DTE-Objekt und das Project-Objekt des allgemeinen Umgebungsmodells.

Die meisten Methoden und Eigenschaften von VSProject2 gelten gleichermaßen für Visual C#-, Visual Basic- und Visual J#-Projekte. Die einzige Ausnahme bildet die Imports-Eigenschaft, die für Visual Basic gilt und Zugriff auf das Imports-Objekt bietet. Weitere Informationen finden Sie unter Gewusst wie: Bearbeiten der Imports-Eigenschaft von Visual Basic-Projekten. Die Events-Eigenschaft ermöglicht den Zugriff auf projektspezifische Ereignisse, z. B. VSLangProjWebReferencesEvents und ReferencesEvents. Ereignisbehandlungsaufgaben werden in anderen Themen beschrieben. Weitere Informationen finden Sie unter Reagieren auf Ereignisse (Visual Basic- und Visual C#-Projekte).

In den nachfolgenden Schritten wird veranschaulicht, wie Sie mithilfe des allgemeinen Automatisierungsmodells programmgesteuert eine Visual C#-Windows-Anwendung erstellen können. Mit den Methoden und Eigenschaften von VSProject2 kann das erstellte Projekt programmgesteuert gesteuert werden.

Hinweis:

Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Bei der Entwicklung dieser Prozeduren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

So steuern Sie mithilfe des VSProject2-Objekts C#- und J#-Projekte

  1. Erstellen Sie in Visual C# ein Visual Studio-Add-In-Projekt.

  2. Klicken Sie im Menü Projekt auf Verweis hinzufügen, klicken Sie auf die Registerkarte .NET, wählen Sie VSLangProj, VSLangProj2 und VSLangProj80 aus, und klicken Sie dann auf OK.

  3. Erstellen Sie zwei Ordner auf dem Computer:

    • <Stammverzeichnis der Installation>\UserFiles\MyProjects\MyTestProject.

    • <Stammverzeichnis der Installation>\UserFiles\MyKeyFiles.

      In diesem Beispiel entspricht das <Stammverzeichnis der Installation> "C:".

  4. Fügen Sie am Anfang der Datei Connect.cs die folgenden using-Anweisungen ein.

    using VSLangProj;
    using VSLangProj2;
    using VSLangProj80;
    
  5. Fügen Sie der OnConnection-Methode den folgenden Methodenaufruf hinzu.

    public void OnConnection(object application, 
    ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        CSVSProj2Manip(_applicationObject);
    }
    
  6. Fügen Sie die CSVSProj2Manip-Methodendeklaration direkt unter der OnConnection-Methode hinzu.

    public void CSVSProj2Manip(DTE2 dte)
    {
    }
    
  7. Fügen Sie am Anfang der Methode die folgenden Deklarationen hinzu.

    Solution2 soln = (Solution2)_applicationObject.Solution;
    String csTemplatePath;
    String csPrjPath;
    Project proj;
    VSProject2 vsproj;
    String webServiceRef;
    BuildManager bldMgr;
    
  8. Erstellen Sie mithilfe von AddFromTemplate ein Visual C#-Projekt.

    • Die Syntax zum Abrufen der Vorlagen lautet EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "CSharp"), wobei der Name " WindowsApplication.zip " aus der Datei WindowsApplication.zip abgerufen wird, die sich im Ordner <Stammverzeichnis der Installation>\Programme\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033 befindet. Diese Dateien befinden sich für alle Visual Studio-Projekttypen im Ordner <Stammverzeichnis der Installation>\Programme\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\Sprache. "CSharp" gibt an, dass es sich bei dem Projekt um ein Visual C#-Projekt handelt.

    • Die Syntax für ein Visual Basic-Windows-Anwendungsprojekt lautet folgendermaßen: EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "VisualBasic"). Die Vorlagen für die Datei WindowsApplication.zip für Visual Basic-Projekte befinden sich im Ordner <Stammverzeichnis der Installation>\Programme\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\VisualBasic\Windows\1033.

    • Die Syntax für ein Visual J#-Windows-Anwendungsprojekt lautet folgendermaßen: EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "JSharp"). Die Vorlagen für die Datei WindowsApplication.zip für Visual J#-Projekte befinden sich im Ordner <Stammverzeichnis der Installation>\Programme\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\JSharp\Windows\1033.

    // Make sure you create the folders that 
    // make up the file path
    // on your computer. You can replace 
    // this with your own file path.
    csPrjPath = "C:\\UserFiles\\MyProjects\\MyTestProject";
    // Get the project template path for a C# windows 
    // application.
    csTemplatePath = soln.GetProjectTemplate("WindowsApplication.zip", "CSharp");
    // Create a new windows application by using the 
    // template obtained above.
    soln.AddFromTemplate(csTemplatePath, csPrjPath,
     "Test2CSProj", false);
    
  9. Fügen Sie den folgenden Code hinzu, um die Verwendung der VSProject2-Methoden zu veranschaulichen.

    Um dem Projekt programmgesteuert einen Webdienst hinzuzufügen, ersetzen Sie den Platzhaltertext im Code, <web service>, durch den URL eines wirklichen Webdienstes. Um nach einer Webdienst-URL zu suchen, öffnen Sie in der integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) von Visual Studio ein Projekt. Klicken Sie im Menü Projekt auf Webverweis hinzufügen. Klicken Sie im Dialogfeld Verweis hinzufügen auf den Link UDDI-Verzeichnis, und suchen Sie in diesem Verzeichnis nach einem Webdienst.

    proj = soln.Projects.Item(1);
    // Cast the project as a VSProject2 object.
    vsproj = (VSProject2)proj.Object;
    // Add a reference to System.Security.dll.
    MessageBox.Show("Adding a reference 
    to System.Security.dll");
    // Remove the <version number> in the following path
    // and replace it with one of the version 
    // number folders that appear 
    // in <installation root>\WINDOWS\Microsoft.NET\Framework
    // folder
    vsproj.References.Add
    ("C:\\WINDOWS\\Microsoft.NET\\Framework\\<version number>\\System.Security.dll");
    // Create a Web references folder.
    MessageBox.Show("Creating a Web references folder.");
    vsproj.CreateWebReferencesFolder();
    // Add a Web reference to the folder.
    MessageBox.Show("Adding a Web reference.");
    // Replace the placeholder, <web service>, with a
    // Web service URL.
    webServiceRef = "<web service>";
    vsproj.AddWebReference(webServiceRef);
    bldMgr = vsproj.BuildManager;
    Array monikers = null;
    // String moniker = null;
    String msg = null;
    Object obj = bldMgr.DesignTimeOutputMonikers;
    if (obj != null)
    {
        try
        {
            monikers = (System.Array)obj;
            foreach(String tempmoniker in monikers)
            {
                msg += bldMgr.BuildDesignTimeOutput
    (tempmoniker) + "\n";
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        MessageBox.Show("The build design-time output is:" 
    + "\n"  + msg);
    }
    // Change the MyHTML file name by using GetUniqueFilename.
    MessageBox.Show("Adding an HTML page named 'MyHTML'...");
    String itemTemplatePath = soln.GetProjectItemTemplate("HTMLPage",
     "CSharp");
    proj.ProjectItems.AddFromTemplate
    (itemTemplatePath, "MyHtml");
    MessageBox.Show("Renaming MyHtml' to 'MyTesthtml.htm'...");
    vsproj.Project.ProjectItems.Item("MyHtml").Name =
     vsproj.GetUniqueFilename(proj, "MyTesthtml", "htm");
    // Generate a key-pair file.
    MessageBox.Show("Generating a key-file...");
    vsproj.GenerateKeyPairFiles("C:\\UserFiles\\MyKeyFiles
    \\MyKeyText2.bin", "0");
    

    Die CSVSProj2Manip-Methode verwendet das VSProject2-Objekt zum Ausführen der folgenden Aufgaben:

    • Hinzufügen eines Verweises auf die Datei System.Security.dll mithilfe von References.

    • Erstellen eines Ordners für Webverweise mithilfe von CreateWebReferencesFolder.

    • Hinzufügen eines Webverweises mithilfe von AddWebReference.

    • Anzeigen der Moniker für die Buildentwurfszeit mithilfe von über die BuildManager-Eigenschaft abgerufenen Methoden.

    • Umbenennen eines neuen Projektelements mithilfe der GetUniqueFilename-Methode. Die CSVSProj2Manip-Methode fügt das Projektelement mithilfe von AddFromTemplate hinzu.

    • Generieren einer Schlüsselpaardatei mithilfe der GenerateKeyPairFiles-Methode.

    Im Beispielabschnitt wird der vollständige Code einschließlich eines try-catch-Blocks für die gesamte Methode aufgelistet.

  10. Um das Add-In zu erstellen, klicken Sie im Menü Erstellen auf Projektmappe erstellen.

  11. Öffnen Sie in der IDE von Visual Studio ein Visual C#-, Visual J#- oder Visual Basic-Projekt.

  12. Klicken Sie im Menü Extras auf Add-In-Manager, und wählen Sie im Dialogfeld Add-In-Manager das Add-In aus. Klicken Sie auf OK, um das Add-In auszuführen.

  13. Zeigen Sie die Schlüsselpaardatei an, die Sie im Ordner <Stammverzeichnis der Installation>\UserFiles\MyKeyFiles mithilfe von Strong Name-Tool (Sn.exe) generiert haben.

Beispiel

Das folgende Beispiel stellt ein einfaches Visual Studio-Add-In dar, mit dem ein Visual C#-Projekt erstellt und mithilfe der Eigenschaften und Methoden des VSProject2-Objekts geändert wird.

using System;
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using System.Windows.Forms;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
public void OnConnection(object application, 
ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;
    CSVSProj2Manip(_applicationObject);
}
public void CSVSProj2Manip(DTE2 dte)
{
    try
    {
        Solution2 soln = (Solution2)_applicationObject.Solution;
        String csTemplatePath;
        String csPrjPath;
        Project proj;
        VSProject2 vsproj;
        String webServiceRef;
        BuildManager bldMgr;
        // Make sure you create the folders that make up the file path
        // on your computer.
        // You can replace this with your own file path.
        csPrjPath = "C:\\UserFiles\\MyProjects\\MyTestProject";
        // Get the project template path for a C# windows application.
        csTemplatePath = soln.GetProjectTemplate
("WindowsApplication.zip", "CSharp");
        // Create a new Windows application by using the template 
        // obtained above.
        soln.AddFromTemplate(csTemplatePath, csPrjPath,
 "Test2CSProj", false);
        proj = soln.Projects.Item(1);
        // Get a reference to the VSProject2 object.
        vsproj = (VSProject2)proj.Object;
        // Add a reference to System.Security.dll.
        MessageBox.Show("Adding a reference to System.Security.dll");
        // Remove the <version number> in the following path
        // and replace it with one of the version 
        // number folders that appear 
        // in <installation root>\WINDOWS\Microsoft.NET\Framework
        // folder
        vsproj.References.Add
("C:\\WINDOWS\\Microsoft.NET\\Framework\\<version number>\\System.Security.dll");
        // Create a Web references folder.
        MessageBox.Show("Creating a Web references folder.");
        vsproj.CreateWebReferencesFolder();
        // Replace the placeholder, <web service>, with a
        // Web service URL.
        MessageBox.Show("Adding a Web reference.");
        // Replace the placeholder, <web service>, with a
        // Web service URL.
        webServiceRef = "<web service>";
        vsproj.AddWebReference(webServiceRef);
        bldMgr = vsproj.BuildManager;
        Array monikers = null;
        // String moniker = null;
        String msg = null;
        Object obj = bldMgr.DesignTimeOutputMonikers;
        if (obj != null)
        {
            try
            {
                monikers = (System.Array)obj;
                foreach(String tempmoniker in monikers)
                {
                    msg += bldMgr.BuildDesignTimeOutput(tempmoniker) 
+ "\n";
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            MessageBox.Show("The build design-time output is:" + "\n"  
+ msg);
        }
        // Change the MyHTML file name by using GetUniqueFilename.
        MessageBox.Show("Adding an HTML page named 'MyHTML'...");
        String itemTemplatePath =
 soln.GetProjectItemTemplate("HTMLPage", "CSharp");
        proj.ProjectItems.AddFromTemplate(itemTemplatePath, "MyHtml");
        MessageBox.Show("Renaming MyHtml' to 'MyTesthtml.htm'...");
        vsproj.Project.ProjectItems.Item("MyHtml").Name =
 vsproj.GetUniqueFilename(proj, "MyTesthtml", "htm");
        // Generate a key-pair file.
        MessageBox.Show("Generating a key-file...");
        vsproj.GenerateKeyPairFiles
("C:\\UserFiles\\MyKeyFiles\\MyKeyText2.bin", "0");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj
Imports VSLangProj2
Imports VSLangProj80
Public Sub OnConnection(ByVal application As Object, _
 ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _
 ByRef custom As Array) Implements IDTExtensibility2.OnConnection
    _applicationObject = CType(application, DTE2)
    _addInInstance = CType(addInInst, AddIn)
    CSVSProj2Manip(_applicationObject)
End Sub
Sub CSVSProj2Manip(ByVal dte As DTE2)
    Try
        Dim soln As Solution2 = CType(_applicationObject.Solution, _
         Solution2)
        Dim csTemplatePath As String
        Dim csPrjPath As String
        Dim proj As Project
        Dim vsproj As VSProject2
        Dim webServiceRef As String
        Dim bldMgr As BuildManager
        ' Create this or your own file path on your computer.
        ' The file path must exist before you run this add-in.
        csPrjPath = "C:\UserFiles\MyProjects\MyTestProject"
        ' Get the project template path for a C# windows application.
        csTemplatePath = soln.GetProjectTemplate _
        ("WindowsApplication.zip","CSharp")
        ' Create a new Windows Application
        ' using the template obtained above.
        soln.AddFromTemplate(csTemplatePath, csPrjPath _
        , "Test2CSProj", False)
        proj = soln.Projects.Item(1)
        ' Cast the project to a VSProject2.
        vsproj = CType(proj.Object, VSProject2)
        ' Add a reference to System.Security.dll.
        MsgBox("Adding a reference to System.Security.dll")
        ' Remove the <version number> in the following path
        ' and replace it with one of the version 
        ' number folders that appear 
        ' in <installation root>\WINDOWS\Microsoft.NET\Framework
        ' folder
        vsproj.References.Add _
        ("C:\WINDOWS\Microsoft.NET\Framework\<version number>\System.Security.dll")
        ' Create a Web references folder.
        MsgBox("Creating a Web references folder.")
        vsproj.CreateWebReferencesFolder()
        ' Replace the placeholder, <web service>, with a
        ' web service URL.
        webServiceRef = "<web service>"
        MsgBox("Adding a Web reference.")
        vsproj.AddWebReference(webServiceRef)
        bldMgr = vsproj.BuildManager
        Dim monikers As String() = Nothing
        Dim moniker As String = Nothing
        Dim msg As String = ""
        Dim obj As Object = bldMgr.DesignTimeOutputMonikers
        If Not obj Is Nothing Then
            Try
                monikers = CType(obj, String())
                For Each moniker In monikers
                    msg &= bldMgr.BuildDesignTimeOutput(moniker) + vbCr
                Next
            Catch ex As System.Exception
                MsgBox(ex.ToString)
            End Try
            MsgBox("The build design-time output is:" + vbCr + msg)
        End If
        ' Use the UniqueFilename to rename a new project item.
        MsgBox("Adding an HTML page called 'MyHTML'...")
        Dim itemTemplatePath As String = _
        soln.GetProjectItemTemplate("HTMLPage", "CSharp")
        proj.ProjectItems.AddFromTemplate(itemTemplatePath, "MyHtml")
        MsgBox("Renaming MyHtml' to 'MyTesthtml.htm'...")
        vsproj.Project.ProjectItems.Item("MyHtml").Name = _
        vsproj.GetUniqueFilename(proj, "MyTesthtml", "htm")
        ' Generate a key-pair file.
        vsproj.GenerateKeyPairFiles _
        ("C:\UserFiles\MyKeyFiles\MyKeyText2.bin", "0")
    Catch ex As System.Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Kompilieren des Codes

Um den Code zu kompilieren, erstellen Sie ein neues Visual Studio-Add-In-Projekt und ersetzen den Code der OnConnection-Methode durch den Code im Beispiel. Informationen zum Ausführen eines Add-Ins finden Sie unter Gewusst wie: Steuern von Add-Ins mit dem Add-In-Manager.

Siehe auch

Konzepte

Einführung in das VSProject2-Objekt

Weitere Ressourcen

Erweitern von Visual Basic- und Visual C#-Projekten