Einbindung einer DLL

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Infinity.

    Einbindung einer DLL

    Hallo zusammen.
    Ich habe vor in einem Projekt die "MySql.Data.dll" in die Res mit einzubinden, da wenn ich den Verweis normal erstelle, das Programm auf Computern ohen die DLL abstürtzt.

    Ich habe bereits diesen Beitrag gefunden "[VB.NET] DLLs in Resourcen einbinden & Verweis darauf" allerdings stürtzt auch bei der benannten Methode mein Programm auf fremden Computern ab.

    Wie kann ich die DLL am einfachsten und effektivsten einbinden, ohne das der Benutzer gezwungen wird ein extra Programm zu installieren.

    Liebe Grüße, Passi.
    Die DLL einfach mit in das Programmverzeichnis kopieren? Wobei ich denke dass die DLL zwar nur eingebunden wird, aber ggf. intern noch auf andere Resourcen zugegriffen wird. Wesswegen wohl auch mit eingebundener DLL das Programm nicht läuft.

    Nat1one schrieb:

    Wenn ich allerdings die DLL mit in das Programmverzeichniss kopieren, wie kann ich das Programm dann so konfigurieren, dass es direkt auf die DLL zugrift?

    Wenn Du Deine DLL in den Verweisen angegeben hast, so steht dort normalerweise "Local Copy=True", d.h. Dein Programm erwartet die DLL im Anwendungsverzeichnis als Voreinstellung und die IDE kopiert die beim Erstellen auch automatisch dorthin.

    Bekomm erst einmal raus warum Dein Programm auf fremden Computern abstürzt: dazu ist eine VM hilfreich.

    Später kannst Du dann immer noch im AssemblyResolve Event Deine DLL aus den Resourcen kopieren ( besonders hübsch als gezippte Resource).
    Hi,

    genau hier schalt ich mich als Fragender einfach mal zu.
    Ich möchte auch auf eine DLL zugreifen die nicht direkt im Verzeichniss der späteren Exe-Datei liegt, verweisen.
    Wenn ich mit

    Private Declare Function MySqlDll...

    die DLL lade erscheint bei mir die bekannte Fehlermeldung "Kein Einstiegspunkt gefunden!".

    Geht sowas denn überhaupt? Eine DLL aus einen anderen Verzeichniss laden?

    Grüße
    Natürlich geht das. Du kannst die DLL speichern wo du willst, nur musst du den Speicherort VB mitteilen. Dazu gibt es das "AssemblyResolve"-Event der MyApplication-Klasse.

    1. Auf My Project im Projektmappenexplorer klicken.
    2. Unter Anwendung auf "Anwendungsereignisse anzeigen" klicken.
    3. Der Klasse folgende Funktion hinzufügen:

    VB.NET-Quellcode

    1. Private Function LoadAssembly(ByVal sender As Object, ByVal args As System.ResolveEventArgs) As System.Reflection.Assembly Handles MyDomain.AssemblyResolve
    2. 'Hier musst du unterscheiden, welche DLL gebraucht wird.
    3. If args.Name.Contains("ID3TagLib") Then
    4. 'Hier wird das Assembly (also die DLL) geladen.
    5. Return System.Reflection.Assembly.Load(My.Resources.ID3TagLib) 'so z. B. aus den Resources
    6. Return System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes("C:\example.dll")) 'so z. B. aus einer Datei
    7. Else
    8. Return Nothing
    9. End If
    10. End Function


    Das ganze gilt natürlich nur für DLLs, bei denen es sich um .Net-Assemblies handelt.

    Zu deinem Versuch mit Declare: Dieses Schlüsselwort würde ich nicht mehr verwenden (stattdessen DllImport). Damit können dann Funktionen aus nativen DLLs eingebunden werden, z. B. den DLLs der WinAPI. Die Fehlermeldung "Kein Einstiegspunkt gefunden" bekommst du immer dann, wenn du versuchst, eine Funktion aus einer Dll-Datei zu verwenden, die es garnicht in der Dll-Datei gibt (zumindest nicht unter dem angegebenen Namen).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()