Eigene EXE findet DLL nicht, nur wenn es im Verzeichnis der EXE ist

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Splamy.

    Hi,
    ich weiß nich ob dir meine Antwort hilft, da sie nicht ganz genau das macht was du willst...

    Man kann eine DLL in ein Prgramm nach dem kompilieren in das Programm miteinbinden mit dem Programm ILMerge
    aus dem Thread: hier
    hat jedenfalls bei meinem Programm super geklappt :thumbup: die dll muss jetzt nicht mehr dabei sein.

    also wenn du die dll hast, kannst du sie einfach einbinden, allerdings weiß ich auch nicht ob es mit mehreren dlls nacheinander geht

    Wenn du das Programm installiert hast, im DOS-Fenster das hier eigeben:

    Quellcode

    1. C:\PfadVonILMerge\ILMerge.exe /t:winexe /out:"C:\DeinPfad\DeinAusgabeProgramm.exe" "C:\DeinPfad\DeinProgramm.exe" "C:\DeinPfad\dieDll.dll"



    *edit*
    hab die installationsdatei in Anhang gestellt
    Dateien
    • ILMerge.zip

      (483,74 kB, 136 mal heruntergeladen, zuletzt: )
    Also ich weiss nicht genau wie das bei VB ist, aber bei C++ ist es so, dass wenn eine DLL dynamisch gelinkt wird und kein genauer pfad eingegeben wird wird zuerst im system32 ordner gesucht, und dann im aktuellen Ordner des Programms..

    wenn deine dll eh in einem bestimmten ordner liegen soll, ausser dem programm ordner und VB genau so vorgeht wie C++ wieso legst du sie dann nicht im system32 ordner ab? Probier doch mit deinem ursprünglichem code mal aus ob die dll gefunden wird wenn sie im system32 ordner liegt, dann weisst du obs geht ^^

    lg leo

    //Edit:
    Nebenbei bemerkt ist es allg. üblich dass wenn eine DLL mitgeliefert werden muss, die in keinem standard LibraryPackage dabei ist (wie den msvc redistributables oder den .net frameworks), sie im Programmordner mitgeliefert werden. Das stört normalerweise auch keinen, wesswegen mich interessieren würde wieso du die dll in einem anderen ordner haben willst?

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

    Noch eine möglichkeit die evtl klappen könnte wäre die DLL, in welchem ordner sie nun auch liegen mag, mit dem DLLRegisterServer zu registrieren.
    Um eine DLL zu registrieren, klickt man auf "Start->Ausführen" und gibt dort (zu deinem Beispiel passend) folgenden befehl ein:

    Quellcode

    1. regsvr32 U:\Daten\Datenbank\System.Data.SQLite.DLL


    Damit sollte die dll von jedem programm in dem angegebenen ordner gefunden werden.

    //Edit:
    Wenn man das ganze von seinen Usern aber nicht erwarten kann, kann man das auch in einer art Installationsprogramm automatisieren lassen indem man folgende Codezeile ausführen lässt:

    VB.NET-Quellcode

    1. System.Diagnostics.Process.Start("regsvr32.exe", "U:\Daten\Datenbank\System.Data.SQLite.DLL")

    Dazu muss sich die dll natürlich in genau dem Ordner befinden der angegeben wurde.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „leonor“ ()

    Samus Aran schrieb:

    Wenn aC nicht funktioniert, hat der Threadersteller etwas falsch gemacht.


    Hallo Samus Aran,

    nun, bei der Bedienung des aC ist es sehr schwer etwas falsch zu machen, oder???

    Hier die Fehlermeldung, die beim Starten der Exe angezeigt wird. Vielleicht kannst du mir ja dann sagen was ich falsch mache !!!

    System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.InvalidOperationException: Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Nicht verifizierbarer Code hat die Richtlinienüberprüfung nicht bestanden. (Ausnahme von HRESULT: 0x80131402). ---> System.IO.FileLoadException: Nicht verifizierbarer Code hat die Richtlinienüberprüfung nicht bestanden. (Ausnahme von HRESULT: 0x80131402)
    bei KKAmbOPVergl.Form1..ctor()
    --- Ende der internen Ausnahmestapelüberwachung ---
    bei KKAmbOPVergl.My.MyProject.MyForms.Create__Instance__[T](T Instance)
    bei KKAmbOPVergl.My.MyApplication.OnCreateMainForm()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei KKAmbOPVergl.My.MyApplication.Main(String[] Args)
    --- Ende der internen Ausnahmestapelüberwachung ---
    bei System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
    bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
    bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    bei assemblyCompressor.Core.subSystem.applicationContext.executeApplication()

    Vielen Dank für Deine Hilfe

    leonor schrieb:

    regsvr32 U:\Daten\Datenbank\System.Data.SQLite.DLL


    Vielen Dank leonor, aber auch hier kommt eine Fehlermeldung, die da lautet:
    das Modul u:\daten\datenbank\system.data.sqlite.dll wurde geladen, aber der dllregistreserver-Eingangspunkt wurde nicht gefunden

    und... dies habe ich auch versucht:

    leonor schrieb:

    Also ich weiss nicht genau wie das bei VB ist, aber bei C++ ist es so, dass wenn eine DLL dynamisch gelinkt wird und kein genauer pfad eingegeben wird wird zuerst im system32 ordner gesucht, und dann im aktuellen Ordner des Programms..


    ... geht auch nicht...

    Splamy schrieb:

    C:\PfadVonILMerge\ILMerge.exe /t:winexe /out:"C:\DeinPfad\DeinAusgabeProgramm.exe" "C:\DeinPfad\DeinProgramm.exe" "C:\DeinPfad\dieDll.dll"


    ... Vielen Dank Splamy, aber leider funktioniert ILMerge auch nicht...


    Schon mal vielen Dank für Eure Hilfe.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TheSaint“ ()

    Samus Aran schrieb:

    Falls das mit der Bedienung ironisch gemeint war, es ist in der Tat schwer, etwas falsch zu machen.
    Was für eine DLL ist das denn? oÔ
    Hat der Autor der DLL es vllt. irgendwie so eingerichtet, dass man sie nicht einbinden kann?


    Diese Frage kann ich leider nicht beantworten...
    Ich habe diese DLL von hier:

    HTML-Quellcode

    1. http://sqlite.phxsoftware.com/


    Vielen Dank allen für den Versuch mir zu helfen.
    Denke komme hier nicht mit weiter und werde es aufgeben.

    Nochmals vielen Dank

    Viele Grüßé

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

    ok, letzter versuch, ich habe die datei system.data.sqlite.dll ein eines meiner programme eingefügt, geht nicht, Fehlermeldung:

    Quellcode

    1. An exception occurred during merging:
    2. ILMerge.Merge: The assembly 'System.Data.SQLite' is not marked as containing onl
    3. y managed code.
    4. (Consider using the /zeroPeKind option -- but read the documentation first!)
    5. bei ILMerging.ILMerge.Merge()
    6. bei ILMerging.ILMerge.Main(String[] args)


    habs danach nochmal ausprobiert mit:

    C:\Programme\ILMerge\ILMerge.exe /t:winexe /zeroPeKind /out:"C:\blabla\Test.exe" "C:\Pfad\Eingang.exe" "C:\Pfad\system.data.sqlite.dll"

    und das einbinden hat tatsächlich geklappt, oder zumindestens gabs keine Fehlermeldung, ob es dann auch ohne dll wirklich klappt weiß ich nicht weil ich kein programm hab das diese dll nutzt ( und selber check ich die auch nicht ^^ ), aber probiers doch nochmal.
    Da haben wirs doch:
    ILMerge.Merge: The assembly 'System.Data.SQLite' is not marked as containing only managed code.

    Die Library enthält nicht nur Managed Code. (Inwiefern das den aC oder ILMerge daran hindert, die DLL einzubinden, weiß ich auch nicht)
    ich weiß, aber mit dem /zeroPeKind hat es bei mit tatsächlich geklappt des zu überbrücken (bei der bass.dll geht das leider nicht, kommt ne andere Fehlermeldung -.-)
    (Consider using the /zeroPeKind option -- but read the documentation first!)