none
Info: Dateinamen der eigenen .dll aus der .dll ermitteln RRS feed

  • Frage

  • Guten Tag,

    ich hatte das Problem, dass ich aus einer von mir erstellten .dll den Speicherort und auch den Namen der Bibliothek (so trivial das klingen mag) ermitteln wollte. Nach längerem suchen im WWW und unzähligen Verweisen auf API-Funktionen bin ich auf diese Lösung mit .NET-Funktionen gestoßen:

    Dim DLLName As String = System.Uri.UnescapeDataString((New System.Uri(Reflection.Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath)

    Vielleicht kann es mal jemand brauchen.

    MfG,

    fro

    Sonntag, 4. Mai 2014 17:49

Antworten

  • Solange die DLL über einen normalen Verweis hinzugefügt wurde, sollte der Pfad zur DLL zurück gegeben werden. (Habe es mit einer Konsole getestet.)
    Anders ist es natürlich, wenn die DLL als Bytes Array geladen wird. Wie ich schon oben schrieb, sollte man die Hinweise aus der MSDN beachten.

    Wenn du willst, kannst du versuchen über den Typ einer Klasse an die Assembly heran zu kommen.

    GetType(Class1).Assembly.Location 'Class1 ist in der DLL
    Dabei sollte das selbe heraus kommen wie mit meinem Code. Bei einer Konsole mit Standardbibliothek ohne besondere Einstellungen sollte auch dein Code das selbe Ergebnis haben.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert f_ro Sonntag, 4. Mai 2014 20:27
    Sonntag, 4. Mai 2014 19:44

Alle Antworten

  • Hallo,
    folgendes sollte auch ausreichen:

    Assembly.GetExecutingAssembly().Location

    Dabei wird einfach der Pfad der ausgeführten Datei ermittelt. (DLLs kann man auch "ausführen").
    Die Assembly-Klasse liegt im System.Reflection-Namespace.
    Zu beachten sind aber auch die Hinweise in der MSDN zu Assembly.Location und Assembly.CodeBase.

    PS: Da du keine Frage gestellt hast, eignet sich der Thread-Typ "Diskussion" besser. Das kannst du nachträglich ändern, indem du über deiner Frage auf "Typ ändern" klickst.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 4. Mai 2014 18:05
  • Danke für die Antwort,

    den Thread wollte ich eigentlich von Frage auf Diskussion ändern aber wahrscheinlich war ich blind!?

    Mit

    Reflection.Assembly.GetExecutingAssembly().Location


    hatte ich es auch zu Beginn versucht aber durch diese Funktion wird der Dateiname des ausführendes Programms (sprich das Programm das den Verweis auf die Bibliothek enthält) zurückgegeben und eben nicht der Name der Bibliothek.

    Deswegen dieser Thread.

    MfG,

    fro

    Sonntag, 4. Mai 2014 18:31
  • Solange die DLL über einen normalen Verweis hinzugefügt wurde, sollte der Pfad zur DLL zurück gegeben werden. (Habe es mit einer Konsole getestet.)
    Anders ist es natürlich, wenn die DLL als Bytes Array geladen wird. Wie ich schon oben schrieb, sollte man die Hinweise aus der MSDN beachten.

    Wenn du willst, kannst du versuchen über den Typ einer Klasse an die Assembly heran zu kommen.

    GetType(Class1).Assembly.Location 'Class1 ist in der DLL
    Dabei sollte das selbe heraus kommen wie mit meinem Code. Bei einer Konsole mit Standardbibliothek ohne besondere Einstellungen sollte auch dein Code das selbe Ergebnis haben.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert f_ro Sonntag, 4. Mai 2014 20:27
    Sonntag, 4. Mai 2014 19:44
  • Nochmal danke für die Antwort,

    Asche auf mein Haupt!

    Mein Fehler war, dass ich davon ausgegangen bin, dass mir der Aufruf aus dem My-Namespace

    My.Application.Info.AssemblyName

    das gleiche Ergebnis liefert wie

    Reflection.Assembly.GetExecutingAssembly().Location

    wohlgemerkt in dieser Assembly (.dll)!

    Ich weiß, ich weiß! Man soll den My-Namespace nicht verwenden! Ich programmiere aber nur für mich selbst und so gesehen habe ich damit keine Probleme. In Zukunft werde ich vorsichtiger sein.

    Schönen Abend noch,

    fro

    • Als Antwort markiert f_ro Sonntag, 4. Mai 2014 20:27
    • Tag als Antwort aufgehoben f_ro Sonntag, 4. Mai 2014 20:27
    Sonntag, 4. Mai 2014 20:26