Announcement

Collapse
No announcement yet.

DLL ohne copy local

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

  • DLL ohne copy local

    Was ich will:

    Ich will eine .dll einbinden, die nicht in dem gleichen Ordner liegt wie die .exe sondern ein oder zwei Ordner tiefer.
    Um genau zu sein:
    die .exe liegt in "...\Programm\" und die .dll liegt in "...\Programm\Referenzen\".
    Aber es ist keine system dll sondern sie soll schon mit dem Programm zusammen ausgeliefert werden.


    Problem:

    Wenn ich die .dll einbinde steht da automatisch "Copy Local = True". Und das heißt, beim build wird die .dll in dem gleichen Ordner wie die .exe erzeugt, was ich ja nicht will.
    Wenn ich "Copy Local = False" setze, wird die dll zwar nicht mehr ungewollt erzeugt, aber das Programm stürzt sofort ab mit "Could not load assembly...file not found."

    Bitte helft mir!

    Achja, es geht um Visual Studio 2008, mein Programm benutzt .NET 2.0.

  • #2
    Hallo,
    1. in .net liegt ein verwendete Assembly (EXE, DLL) entweder im selben Verzeichnsi wie die ausführbare Datei oder im GAC (Global Assembly Cache)
    2. oder die Assembly wird per Reflektion geladen. Dabei ist egal wo die Assembly liegt.


    Die Reflections-Methode hat allerdings Nachteile:
    • nicht so effizient da "spätes Binden" verwendet wird
    • es kann kein stark typisierte Code geschrieben werden. Alles wird als Objekt behandelt. Das verkompliziert die Sache ziemlich.


    Folgerung: Lass die DLL im selben Verzeichnis wie die EXE.

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

    Comment


    • #3
      Wenn du referenzierte Assemblies irgendwo ablegen willst mußt du das Probing in der Config Datei deiner Anwendung um die entsprechenden Verzeichnisse ergänzen damit diese beim auflösen der Referenzen auch untersucht werden.

      Guckst du hier.

      Trotzdem solltest du dir Gü Folgerung zu herzen nehmen.
      Wenn du viele Verzeichnisse ins Probing aufnimmst geht die Startup Zeit der Anwendung deutlich in die Höhe.

      Comment


      • #4
        NET bietet noch eine weitere Möglichkeit, mit der in der app.config der Suchpfad erweitert werden kann:
        Code:
          <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
              <probing privatePath="Remote;Tools" />
            </assemblyBinding>
          </runtime>
        Diese Einstellung sorgt dafür, dass NET die DLLs auch unterhalb des exe-Verzeichnisses in den Unterverzeichnissen Remote und Tools sucht.

        Siehe SDK-Doku/MSDN unter probing-Element.

        Jürgen

        /Edit
        2 gleiche Antworten gleichzeitig.

        Comment


        • #5
          Danke soweit schonmal!

          Hab da noch zwei Fragen dazu:

          -
          Wenn du viele Verzeichnisse ins Probing aufnimmst geht die Startup Zeit der Anwendung deutlich in die Höhe.
          Hm meint ihr das hat schon merkbare Auswirkungen bei einem Verzeichnis? Es ist wirklich nur das eine Verzeichnis und da sind nur 2 dlls drin.

          - Wo finde ich die app.config, bzw. wo in VS kann ich diese Einstellung vornehmen?

          Comment


          • #6
            Wo finde ich die app.config, bzw. wo in VS kann ich diese Einstellung vornehmen?
            Neues Element hinzufügen -> Anwendungkonfigurationsdatei (App.config) -> dann das Konfig-Schnippsel aus der Antwort einfügen.

            Bei einem Verzeichnis mit 2 Dateien sollte es nicht so tragisch sein.

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

            Comment


            • #7
              Ok, so funktioniert es mit der app.config. Aber hunderprozentig zufrieden bin ich mit der Lösung noch nicht.
              Jetzt hab ich neben der .exe eine "Programmname.exe.config" Datei liegen, eben die app.config. Und das will ich eigentlich auch nicht. Am liebsten wäre mir wenn da nichts außer der .exe liegen würde! Oder wenn ich die app.config wenigstens umbenennen könnte so dass sie nicht mehr wie das Programm heißt aber das geht scheinbar nicht.

              Was ist mit der Option
              VS 2008 -> Solution Properties -> References -> Reference Paths...

              ?
              Da kann ich Pfade angeben, aber wenn ich da den Pfad angebe in dem meine dlls liegen, stürzt das Programm trotzdem ab. Mach ich was falsch oder ist der Reference Paths garnicht für sowas gedacht?

              Comment


              • #8
                Aber hunderprozentig zufrieden bin ich mit der Lösung noch nicht.
                Jetzt hab ich neben der .exe eine "Programmname.exe.config" Datei liegen, eben die app.config. Und das will ich eigentlich auch nicht. Am liebsten wäre mir wenn da nichts außer der .exe liegen würde!
                Dann hast du dir die falsche Programmierplattform ausgesucht. Wenn du das willst dann wäre eine Sprache die Vorteile von .net bezüglich DLL-Hölle nicht hat vorzuziehen zB VB6.

                Wo ist das Problem wenn neben der EXE noch die anderen DLLs und config-Dateien da sind?

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

                Comment


                • #9
                  Es ist eigentlich nicht so wichtig, ich hätte es einfach schön gefunden wenn da nur die .exe liegen würde. Könnt ihr mir trotzdem erklären was es mit dem "Reference Paths" auf sich hat? Das scheint nämlich überhaupt keinen Effekt zu haben.

                  Comment


                  • #10
                    http://msdn.microsoft.com/de-de/library/8y13ka7c.aspx

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

                    Comment


                    • #11
                      Ok, das klingt ja alles ganz logisch, aber wieso funktioniert das dann nicht? Wenn ich z.b. über "Pfad hinzufügen..." Den Ordner "Referenzen" einfüge und in diesen Ordner dann meine .dll lege und dann die .dll aus diesem Ordner lade () und dann bei der .dll "copy_local=false" setze, dann funktioniert es trotzdem nicht und der sagt beim Programmstart "Dll oder assembly nicht gefunden...".

                      Comment


                      • #12
                        Reference Paths's werden zur Designzeit von Visual Studio verwendet um bestimmte referenzierte Assemblies zu finden. Die haben aber nichts mit dem Laufzeitverhalten deiner Anwendung zu tun.

                        Comment


                        • #13
                          Ok, also nochmal ganz konkret gefragt:

                          Gibt es eine Möglichkeit mit VB.Net, dass meine .dlls und auch sonst nichts (keine app.config etc.) in meinem .exe Ordner liegen? Also dass da nur die .exe liegt und alles andere in Unterordnern?

                          Falls das nicht geht, gibt es eine Möglichkeit die app.config umzubenennen? Die heißt bei mir automatisch "Programmname.exe.config". Sobald ich sie umbenenne oder in VS unter einem anderen Namen als app.config speichere, geht das Programm nicht mehr.

                          Comment


                          • #14
                            Gibt es eine Möglichkeit mit VB.Net, dass meine .dlls und auch sonst nichts (keine app.config etc.) in meinem .exe Ordner liegen? Also dass da nur die .exe liegt und alles andere in Unterordnern?
                            Wie das für Assemblies geht haben wir in diesem Thread erklärt.

                            Falls das nicht geht, gibt es eine Möglichkeit die app.config umzubenennen? Die heißt bei mir automatisch "Programmname.exe.config". Sobald ich sie umbenenne oder in VS unter einem anderen Namen als app.config speichere, geht das Programm nicht mehr.
                            Die App.Config muß im selben Ordner wie das Executable liegen. Warum willst du sie umbennen? Sie heißt in der Solution immer App.config wird dann aber von VS als Programmname.exe.config in den Build Ordner kopiert. Es gibt eigentlich keinen Grund daran rumzuspielen.

                            Comment


                            • #15
                              Ok Danke für die Antworten!

                              Comment

                              Working...
                              X