Entwickler-Ecke

Sonstiges (.NET) - Add In Datei in Projektmappe kopieren


MitgliedsnameUnbekannt - Di 29.10.13 16:29
Titel: Add In Datei in Projektmappe kopieren
Hallo :)

Ich habe ein Add In in Visual Studio geschrieben. Dieses soll nun die Datei "Beispiel.txt" in die Projektmappe von dem geöffnetem Programm kopieren. Das funktioniert mit folgender Codezeile fast:


C#-Quelltext
1:
m_Solution.Projects.Item(1).ProjectItems.AddFromFileCopy(file);                    


aber er fügt diese Datei nun dem Projekt hinzu und nicht, wie gwünscht, der Projektmappe.
Jemand eine Idee was ich ändern kann?
Verdeutliche meine Frage nochmal mit dem Bild im Anhang.

(Es ist wichtig das die Datei während der Laufzeit in dem Projektmappenexplorer angezeigt wird.)


Moderiert von user profile iconChristian S.: Topic aus Basistechnologien verschoben am Mo 04.11.2013 um 11:32


Th69 - Di 29.10.13 17:23

Hallo,

so viel ich weiß kann eine Projektmappe (Solution) nur Projekte aufnehmen, d.h. es ist unmöglich dort einzelne Dateien zu hinterlegen, s.a. Solution (.Sln) File [http://msdn.microsoft.com/en-us/library/bb165951%28v=vs.90%29.aspx].


MitgliedsnameUnbekannt - Di 29.10.13 17:32

Okay, das kann gut sein.
Ich kann aber mit Rechtsklick auf meine Projektmappe einen neuen Ordner hinzufügen und dort Dateien reinlegen. Dann ist der Ordner nicht in dem Projekt xy sondern in meiner Projektmappe.
Das müsste doch dann auch per Code gehen?


Ralf Jansen - Di 29.10.13 17:50

Einen SolutionFolder [http://msdn.microsoft.com/en-us/library/EnvDTE80.SolutionFolder.aspx] kann mann scheinbar auch per API hinzufügen. Darüber aber dann scheinbar nur Projecte aber keinen sonstigen Files, auch wenn der SolutionExplorer das selbst hergibt, hinzufügen.

Wenn man sich die sln Datei ansieht wird der SolutionFolder dort scheinbar genauso behandelt wie ein Project insofern könnte ich mir vorstellen das man den auch genauso ansprechen kann.
Sinnvollerweise mit Namen und nicht mit einem Index.


C#-Quelltext
1:
m_Solution.Projects.Item("meinLieberSolutionFolderName").ProjectItems.AddFromFileCopy("meinLieberDateiPfad");                    


MitgliedsnameUnbekannt - Di 29.10.13 17:57

"Sinnvollerweise mit Namen und nicht mit einem Index."

Ja, das wäre mir auch lieber, aber dann kommt immer folgendes (egal welches item ich mit Namen statt index anspreche):

Falscher Parameter. (Ausnahme von HRESULT: 0x80070057 (E_INVALIDARG))


"Wenn man sich die sln Datei ansieht wird der SolutionFolder dort scheinbar genauso behandelt wie ein Project insofern könnte ich mir vorstellen das man den auch genauso ansprechen kann."

nein, das geht leider nicht. Der SolutionFolder wird nicht als item "anerkannt".


Ralf Jansen - Di 29.10.13 18:21

AddSolutionFolder an der Solution liefert aber ein Project. Hmmh.

Als Trockenübung (mein VS2013 bockt :( da hat sich hoffentlich am DTE Interface nicht zuviel geändert)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    foreach (Project item in ((DTE2)application).Solution.Projects)
    {
        if (item.Kind == ProjectKinds.vsProjectKindSolutionFolder &&
            item.Name == "meinLieberFolderName")
        {
            item.ProjectItems.AddFromFile("meinLieberFilePfad");
        }
    }           
}


MitgliedsnameUnbekannt - Di 29.10.13 18:34

Wenn ich deinen Quelltext, Ralf Jansen, einbaue und eine MessageBox in die Schleife einbringe, die mir jeden Item-Name den er untersucht ausgibt, taucht dort der Name der Projektmappe nicht auf, sondern nur die Projekte oder auch Ordner die in der Projektmappe enthalten sind. Ich möchte ja aber mein File der Projektmappe hinzufügen.


Ralf Jansen - Di 29.10.13 18:53

Eine Solution(Projektmappe) kann ja auch direkt keine Files enthalten. Ein Solution besteht aus Projekten. Es gibt aber die Sonderform eines Projekts eben einen Solutionfolder. Dem kann man dann wie jedem Project Dateien hinzufügen. Der erscheint visuell aber eben als Ordner mit Dateien in der Solution und nicht als Projekt. Ergo du mußt deine Dateien in einem Solutionfolder ablegen. Da es diesen Ordner nicht mal physisch auf der Platte gibt sehe ich da auch kein Problem da einen Ordner zu haben.


MitgliedsnameUnbekannt - Mi 30.10.13 09:39

genau das ist was ich will! :D aber ich weiß nicht wie. Ich möchte den Ordner ja nicht selbst anlegen sondern während das Programm läuft anlegen lassen.

Moderiert von user profile iconTh69: Full-Quote entfernt.


MitgliedsnameUnbekannt - Mi 30.10.13 09:56

habe ich jetzt wie folgt realisiert...


C#-Quelltext
1:
2:
3:
4:
5:
Project prj;
SolutionFolder sf;
Solution2 solution = (Solution2)m_Solution;

prj = solution.AddSolutionFolder("Test");


aber ich bekomme diese Fehlermeldung:

"Der Ordner enthält bereits ein Element mit dem Namen "Test", oder der Ordnername ist reserviert."

es ist aber kein Element mit diesem Namen vorhanden... -.-


MitgliedsnameUnbekannt - Mi 30.10.13 10:08

hat sich erledigt. Das Problem war das ich die Funktion danach nochmal aufgerufen habe.

Also es ist nun wie folgt gelöst:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
 //Solutionordner hinzufügen
Project project;
Solution2 solution = (Solution2)m_Solution;
project = solution.AddSolutionFolder("neuer Ordner");

//Datei hinzufügen
project.ProjectItems.AddFromFileCopy(filepath);


Danke für jede Hilfe! [: