Announcement

Collapse
No announcement yet.

Dll über Verweis einbinden -> FileNotFoundException

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

  • Dll über Verweis einbinden -> FileNotFoundException

    Hallo zusammen,

    ich beschäftige mich gerade damit eine DLL aus einem anderen Projekt einzubinden. Dazu habe ich jetzt einiges hier im Forum gelesen.

    Ich habe eine einfache DLL TestClass.dll in Visual C# Express Version 2005 erstellt. Diese habe ich dann wie folgt in ein neues Projekt eingebunden.

    - Ordner lib erstellt
    - Darin die Datei TestClass.dll per Copy and Paste abgelegt
    - Dann per rechter Maustaste auf Verweise -> Verweise hinzufügen gegangen.
    - Dort die gerade zugefüge dll aus dem lib Ordner ausgewählt.
    - Dann in den Eigenschaften des Verweises die Option "Lokale Kopie" auf false gestellt, weil ich gerne möchte, dass die dll mit in das Assembly kommt und nicht extra ausgegeben wird.

    Wenn ich nun auf einen Button klicke wo ich im Click Event auf die Klasse in der TestClass.dll zugreife erhalte ich eine FileNotFoundException.

    Ich verstehe nicht was ich falsch mache. Die DLL ist auf dem gleichen Rechner erstellt worden wo ich sie jetzt auch verwenden.

    Muss ich noch was spezielles einstellen?

    Grüße und vielen Dank

  • #2
    - Dann in den Eigenschaften des Verweises die Option "Lokale Kopie" auf false gestellt, weil ich gerne möchte, dass die dll mit in das Assembly kommt und nicht extra ausgegeben wird.
    Nein. Assembly werden nie hinzugelinkt. Das wiederspricht dem .Net Paradigma. Assemblies sind immer extra dlls. Es gibt eine nachträgliche Möglichkeit Assemblies per ILMerge (Extratool gehört weder zum Framework noch zu Visual Studio) zusammenzufassen das wäre aber ein Extraschritt nach dem kompilieren. Heißt wenn du keine lokale Kopie der Assembly hast und diese auch weder im Suchpfad noch im GAC liegt kann dein Projekt die zur Laufzeit nicht finden und weint halt.

    Comment


    • #3
      Hallo Ralf,

      weint halt.
      :-)

      ich hatte mich an folgendem Link orientiert: http://adamthetech.com/2011/06/embed...harp-winforms/

      nur leider funktioniert es nicht. Ich erhalte den gleiche genannten Fehler und die Abhilfe im letzten Schritt klappt auch nicht.

      Im Grunde wollte ich eigentlich die zedgraph.dll inkludieren. Ich wollte diese nicht extra im Programmorder vorhalten.

      Grüße

      Comment


      • #4
        Das erscheint mir ziemlich krank eine Assembly als Resource in die Executable zu packen. Aber wenn du auch wirklich alle Schritte befolgst sollte das funktionieren.

        Wenn du meinst alles getan zu haben würde ich empfehlen mal ausgehend vom AssemblyResolve Event das zu debuggen. Je nachdem ob bzw. wann du in diesem Event landest solltest du sehen ob der eventuell zu spät bzw. gar nicht aufgerufen wird oder von da die Assembly nicht geladen werden kann. Hast du geprüft ob zedgraph selbst wiederum andere Abhängigkeiten hat? Wenn Assemblies beim laden nicht gefunden werden können bezieht sich die Fehlermeldung nicht zwingend auf die Assembly selbst sondern evetuelle auf eine abhängige Asssembly dieser Assembly.

        Comment


        • #5
          Hallo,

          na was heißt krank. Wenn der Kunde nur eine Exe haben will, scheint er krank zu sein. Als Dienstleister muss man halt nach einer Lösung schauen :-) Kennst du bestimmt auch, oder?

          Na ich habe zumindest das Tutorial so befolgt wie es da steht. Ich hatte ja extra ein eigenes Projekt gemacht um eine einfache DLL zu erstllen, damit ich ausschließen kann das der Fehler an der zedgraph.dll liegt.

          Comment


          • #6
            Kennst du bestimmt auch, oder?
            Na klar. Aber man hat ja als der ~Experte~ auch die Möglichkeit durch passende Beratung seine Kunden von irgendwelchen Abwegen abzubringen
            Eine einzelne Exe scheint mir nicht einfacher als ein einzelner Ordner zu sein. Beides ist simpel per XCopy deploybar. Und sobald bestimmte andere Notwendigkeiten enstehen (z.B. eine exe.config ) ist es eh vorbei mit der einzelnen Executable.

            Wenn du unbedingt eine einzelne Exe willst solltest du dir eher das bereits erwähnte ILMerge ansehen. Das Ergebnis ist dann wirklich eine Assembly mit den gemergten Namespace/Klassen aus den verschiedenen Quell Assemblies und keine Resourcenvergewaltigung.

            Comment


            • #7
              Aber man hat ja als der ~Experte~ auch die Möglichkeit durch passende Beratung seine Kunden von irgendwelchen Abwegen abzubringen
              das stimmt, jedoch benötigt man genügend Argumentationen dazu. Deshalb die Fragen :-)

              Ich hatte es jetzt versucht mittels folgendem nachzulesen. Das scheint mir aber zu umständlich für jeden Methodenaufruf

              Comment


              • #8
                folgendem was??

                Comment


                • #9
                  sorry,

                  ihrgend wie den rest verschluckt:

                  Code:
                  ResourceManager resourceManager = new ResourceManager("WindowsApplication3.Properties.Resources", Assembly.GetExecutingAssembly());
                  object objs = resourceManager.GetObject("ClassLibrary", CultureInfo.CurrentCulture);
                  Assembly assembly = Assembly.Load((byte[])objs);
                  MethodInfo methodInfo = assembly.GetType("ClassLibrary.Class1").GetMethod("test");
                  object result = methodInfo.Invoke(Activator.CreateInstance(assembly.GetType("ClassLibrary.Class1")), new String[] { "parameter 1" });
                  MessageBox.Show(result.ToString());

                  Comment


                  • #10
                    Wenn das bei dir funktioniert hat sind wir wieder an dem Punkt den AssemblyResolve Event zu debuggen. Den dort passiert laut dem verlinkten Beitrag auch nichts anders. Und ja jede Methode dynamisch aufzurufen ist sicher keine Lösung. Denn wenn sich da irgendwas ändert am Interface der Assembly knallt es erst zur Laufzeit und nicht schon beim kompilieren. Dort Fehlersuche/Wartung beutreiben zu müßen ist ein Horror das solltest du dir grundlos nicht antun.

                    Comment


                    • #11
                      Hallo neo_1,

                      ich rate dir von diesem Versuch ab. Schau dir lieber, wie schon erwähnt, ILMerge an.

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

                      Comment


                      • #12
                        Hallo zusammen,

                        ich habe jetzt noch einmal das Tutorial unter hier ausprobiert. Leider bleibe ich immer an der Stelle:

                        8) In the code view for your executing WinForms application, you can now include the dll file’s namespace(s) .
                        hängen.

                        Ich habe die Ressource als Embedded inkludiert wie unter Punkt 5 Absatz 3 beschrieben.

                        Mir sagt mein Compiler jetzt, dass der Namespace nicht vorhanden sei. Ihrgend wie auch logisch, aber vielleicht mache ich da auch was falsch.

                        Grüße und Danke

                        Comment


                        • #13
                          Das ganze "Assembly als Resource"-Gedöns funktioniert nur zur Laufzeit. Zur Designzeit brauchst du eine stinknormale Referenz auf die Assembly. Wenn du also Punkt 4 berücksichtigt hast und eine gültige Referenz hinzugefügt hast sollte das funktionieren. Der Rest der danach folgt ist erstmal irrelevant.

                          Comment

                          Working...
                          X