Announcement

Collapse
No announcement yet.

Assemblies ins Ausgabeverzeichnis kopieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Assemblies ins Ausgabeverzeichnis kopieren

    Hallo zusammen,

    Immer wieder kommt es bei mir vor, dass ich Assemblies in einer Klassenbibliothek referenziere die nicht im GAC liegen (NHibernate z.B.). Diese Assemblies können evtl. von weiteren Assemblies abhängig sein die mit im selben Ordner liegen müssen (z.B. NHibernate.ByteCode.Castle.dll).

    Verwende ich nun meine selbst erstellte Klassenbibliothek in einem anderen Projekt werden nur die Assemblies weiter gereicht die ich auch verwende (z.B. NHibernate.dll) die anderen, ich nenne es mal indirekt, referenzierten Assemblies werden NICHT ins Ausgabeverzeichnis kopiert (z.B. NHibernate.ByteCode.Castle.dll)..

    Ich habe schon versucht z.B. die NHibernate.ByteCode.Castle.dll von meiner Assembly aus referenzieren zu lassen und Copy Local auf true zu stellen. Dann landet sie zwar im Ausgabeverzeichnis meiner Assembly, wird jedoch nicht an die anderen weiter gereicht.

    Bei anderen Dateien läuft das ähnlich. Zum Beispiel habe ich in einem Projekt eine Word Datei als Vorlage. Für diese kann ich auch definieren, dass sie ins Ausgabeverzeichnis kopiert wird. Funktioniert wunderbar. Nur leider wird diese auch nicht in das endgültige Projekt kopiert und ich darf das jedesmal händisch machen. Nicht sehr effizient und eigentlich kanns das auch nicht sein. Aber ich wüsste auch nicht wo ich noch schauen soll.

    Hat jemand einen Tip? Wäre sehr dankbar!!!

    Grüße
    Fanderlf

  • #2
    Hallo Florian,

    was sonst praktisch ist kann auch unpraktisch werden

    Für solche Fälle arbeite ich mit svn:externals (vorausgesetz Versionierung mit Subversion - TortoiseSVN). D.h. es gibt einen gemeinsamen Ordner indem die 'shared Resources' liegen. Von dort aus referenziere ich in den Projekten - wenn sie nicht im GAC liegen können/sollen.

    Für das Word-Bsp. ev. in Verbindung mit einem Postbuild-Script welches das in das gemeinsame Verzeichnis kopiert.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Das die abhängigen Referenzen einer referenzierten Assembly automatisch mit ins Projekt aufgenommen werden geht glaube ich nur für Toolbox Items.
      Also wenn deine Klassenbibliothek ein Control enthält das du aus der Toolbox auf eine Designer ziehst werden alle benötigten (also auch die indirekten) Referenzen mit ins Projekt aufgenommen und landen dann natürlich auch mit im Ausgabeverzeichnis. Das ist aber vermutlich Magie des Designers und nicht steuerbar. Geht das bei dir nicht?

      Wenn du selbst irgendwas manuell referenzierst musst du selbst dessen Abhängigkeiten auflösen und dem Projekt hinzufügen. Ein Ausweg (nicht immer anwendbar) wäre z.B. einfach alle Abhängigkeiten in der Assembly zusammenzumergen (ILMerge). Macht aber nur richtig Sinn nur wenn die ursprüngliche Assembly der einzige direkte Benutzer der Abhängigkeiten ist. (Bei Assemblies aus dem Castle Projekt eher unwahrscheinlich)

      Comment


      • #4
        Hm mich wundert das allerdings aus Sicht des Visual Studio. Folgendes Beispiel:

        MyDataAccess referenziert NHibernate, NHibernate.ByteCode.Castle
        Ausgabe:
        MyDataAccess.dll
        NHibernate.dll
        NHibernate.ByteCode.Castle.dll

        MyBusinessLogic referenziert MyDataAccessLayer
        Ausgabe:
        MyBusinessLogic.dll
        MyDataAccess.dll

        Bei MyBusinessLogic fehlt jetzt aber zum Ausführen aus dem Ausgabeverzeichnis die NHibernate.dll und die NHibernate.ByteCode.Castle.dll. Aber es kann doch nicht sein, dass ich diese hier wieder hinzufügen muss nur damit ich das Teil ausführen kann. Damit wäre ja die ganze unabhängig beim Teufel. Manuell hinkopieren kann ja auch nicht die Lösung sein.

        Eigentlich müsste VS das doch bemerken. Im Endeffekt müsste es den kompletten Output des Projekt MyDataAccess nach MyBusinessLogic kopieren.

        Einen Ordner für gemeinsam genutzt Resourcen hab ich natürlich. Ich kopiere die NHibernate.dll nicht in jedes Projekt einzeln.

        Comment


        • #5
          Bei MyBusinessLogic fehlt jetzt aber zum Ausführen aus dem Ausgabeverzeichnis die NHibernate.dll und die NHibernate.ByteCode.Castle.dll. Aber es kann doch nicht sein, dass ich diese hier wieder hinzufügen muss nur damit ich das Teil ausführen kann. Damit wäre ja die ganze unabhängig beim Teufel. Manuell hinkopieren kann ja auch nicht die Lösung sein.
          Nur weil du etwas referenzierst heißt nicht unbedingt das du es in dem Context der Anwendung auch brauchst. Beispiel wenn du in MyBusinessLogic nur Logik benutzt die nie Code aus MyDataAccess ausführt dann muss zwar MyDataAccess trotzdem geladen werden aber die Abhängigkeiten von MyDataAccess nicht. Die würden erst beim ersten richtigen Zugriff auf MyDataAccess geladen werden. Ergo müsstest du die diese auch nicht verteilen. Es macht (meine Meinung) nur Sinn wenn VS direkte Referenzen automatisch übernimmt (weil die auch garantiert geladen werden) alles andere kann VS nicht ermitteln und ich will als Entwickler nur das im Outputordner haben und verteilen müssen was ich auch wirklich brauche nicht einfach alles(auf verdacht).

          Comment


          • #6
            Originally posted by Ralf Jansen View Post
            Nur weil du etwas referenzierst heißt nicht unbedingt das du es in dem Context der Anwendung auch brauchst. Beispiel wenn du in MyBusinessLogic nur Logik benutzt die nie Code aus MyDataAccess ausführt dann muss zwar MyDataAccess trotzdem geladen werden aber die Abhängigkeiten von MyDataAccess nicht. Die würden erst beim ersten richtigen Zugriff auf MyDataAccess geladen werden. Ergo müsstest du die diese auch nicht verteilen. Es macht (meine Meinung) nur Sinn wenn VS direkte Referenzen automatisch übernimmt (weil die auch garantiert geladen werden) alles andere kann VS nicht ermitteln und ich will als Entwickler nur das im Outputordner haben und verteilen müssen was ich auch wirklich brauche nicht einfach alles(auf verdacht).
            Hm OK Gibts dann trotzdem irgendwie ne einfache Lösung die gewünschten Dateien in den Outputordner des ausführbaren Projekts zu bekommen ohne sie dort manuell hin zu kopieren?

            Comment


            • #7
              Hallo,

              im Postbuild-Ereignis ein *.bat ausführen welches das erledigt (in den Projekteigenschaften).



              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                OK, dann werd ich mir das für die Zukunft so machen. Einfach für die ausführbaren Projekte mit so einer .bat Datei ausstatten die mir die Dateien an die gewünschte Position kopiert. Lassen sich die .bat Dateien parameterisieren (z.B. für Debug und Release Build)?

                Comment


                • #9
                  Du hast im Post bzw. Pre Build Event Zugriff auf Umgebungsvariablen wie zum Beispiel $(ConfigurationName) was du bräuchtest. Die kannst du wenn du willst an ein *.bat weiterreichen oder gleich auswerten.

                  Comment


                  • #10
                    ah super genau das meinte ich. Vielen Dank!!! Das wird mir bestimmt weiter helfen.

                    Comment


                    • #11
                      Gibts irgendwo eine Auflistung aller verfügbaren Umgebungsvariablen?

                      Edit: Ok schon selbst gefunden. Das ganze läuft unter Macros und kann unter "Project Properties -> Build Events -> Edit-Pre Builds -> Macros..." eingesehen werden
                      Zuletzt editiert von fanderlf; 09.08.2010, 11:02.

                      Comment


                      • #12
                        Perfekt Funktioniert wunderbar. Hier gleich noch die Lösung:

                        im Pre-Build hab ich folgendes eingetragen:

                        Code:
                        $(ProjectDir)\CopyNecessaryFile.bat $(SolutionDir) $(ProjectDir)$(OutDir)
                        Die Batch-Datei sieht so aus:

                        Code:
                        @echo off
                        rem parameter1: base directory of the solution
                        rem parameter2: output directory of the solution
                        md %2
                        copy %1\SharedLibs\*.* %2 /V /Y
                        copy %1\DcoumentExport\BaseDocument.docx %2 /V /Y
                        Natürlich einige Namen geändert, aber Prinzip sollte klar sein

                        Comment


                        • #13
                          Ich würde copy noch durch robocopy ersetzen. Dann wird auch nur kopiert wenn kopiert werden muss Man bedenke das sonst auch der Build abbricht wenn nicht kopiert werden kann, weil zum Beispiel irgendein Teil der Anwendung noch läuft und die Assemblies referenziert, bei Client Server Systemen durchaus üblich. Man könnte zwar auch einfach ein exit 0 ans Ende des Build Steps packen aber das ist doch etwas zu rabiat.

                          Comment

                          Working...
                          X