Entwickler-Ecke

IO, XML und Registry - Dynamisch Aufruf einer nicht verwalteten DLL-Datei von .NET


doubleII - Di 08.11.16 09:42
Titel: Dynamisch Aufruf einer nicht verwalteten DLL-Datei von .NET
Hallo zusammen,

ich versuche folgendes:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
        static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string dllToLoad);
   
        //Konstruktor
        static MyLibrary()
        {
            LoadLibrary(@"E:\DLL_Scorpion\Toolbox.dll");

        }

        #region Declaration
        //Initialize Toolbox!
        [DllImport("Toolbox.dll",
             CharSet = CharSet.Ansi, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
        public static extern int Initialize(string systemPath, string license, [MarshalAs(UnmanagedType.FunctionPtr)] DllLogFunc logFunc);

Zeigt mir, dass die .dll Datei nicht gefunden werden kann. Woran kann es liegen?


Ich wollte noch fragen muss ich die Funktionen auch berücksichtigen?

C#-Quelltext
1:
2:
3:
4:
5:
6:
 [DllImport("kernel32.dll")]
        static extern IntPtr GetProcAddress( string dllTolOad,
            [MarshalAs(UnmanagedType.LPStr)] string dllToLoad);

                [DllImport("kernel32.dll")]
        static extern bool FreeLibrary(string dllToLoad);


Schöne Grüße
doubleII


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Di 08.11.2016 um 09:41


Delete - Di 08.11.16 11:17

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Di 08.11.16 12:09

Warum benutzt du LoadLibrary überhaupt? PInvoke nimmt dir das eigentlich ab.
Oder willst du aus irgendeinem Grund das DllImportAttribute durch eigenes Handling ersetzen?


doubleII - Di 08.11.16 12:44

Na ja Ralf,
Zitat:
Warum benutzt du LoadLibrary überhaupt? PInvoke nimmt dir das eigentlich ab.

sonst muss ich bei jeder Funktion den Pfad explizit eingeben, sonst wird die .dll Datei nicht gefunden:

C#-Quelltext
1:
2:
3:
4:
5:
 #region Declaration
        //Initialize Toolbox!
        [DllImport(@"E:\DLL_Scorpion\Toolbox.dll",
             CharSet = CharSet.Ansi, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
        public static extern int Initialize(string systemPath, string license, [MarshalAs(UnmanagedType.FunctionPtr)] DllLogFunc logFunc);


es ist nicht nur eine Funktion, aber das ist eindeutig. Wenn ich den Pfad ändere, muss ich bei jeder Funktion den Pfad korrigiere. Wie kann ich das geschickter schreiben?

Vielen Dank!

Schöne Grüße
doubleII


Th69 - Di 08.11.16 13:10

Hallo,

lies dir mal
How can I specify a [DllImport] path at runtime? [http://stackoverflow.com/questions/8836093/how-can-i-specify-a-dllimport-path-at-runtime]
Specify the search path for DllImport in .NET [http://stackoverflow.com/questions/2864673/specify-the-search-path-for-dllimport-in-net]
durch...


doubleII - Di 08.11.16 15:10

irgendwie komme ich nicht klar. :(


Delete - Di 08.11.16 19:51

- Nachträglich durch die Entwickler-Ecke gelöscht -


doubleII - Mi 30.11.16 12:40

ich möchte relativen Pfad eingeben Bsp
%HOMEPATH%\..\..
wie könnte ich es machen, verstehe ich immer noch nicht. :(

Die Klasse ist static!


Ralf Jansen - Mi 30.11.16 14:31

Kannst du bitte genauer erklären warum du das willst was du willst?

Das ein Teil des Programms nicht an einem Ort liegt relativ zum Programm ist außer in speziellen Fällen nicht nur ungewöhnlich sondern auch eher hinderlich.
Ein spezieller Fall wäre zum Beispiel ein Plugin/Addin System das hier klingt aber gar nicht danach. Diesen relativen Pfad, dann nicht zur Anwendung relativ, dann hart zu kodieren klingt nach Blödsinn.

Diese unmanaged Dll scheint so wie du es machst relevant für die Anwendung zu sein und nicht optional wieso legst du sie dann nicht an einen Ort relativ zur Anwendung also z.B direkt in den Anwendungsordner? Du wirst sie eh deinem Programm mitgeben müssen damit die Anwendung funktioniert oder?