Dll zur Laufzeit einbinden?

Fastkiller

Mitglied
Hallo!

Ich hab da ein Problem: Mir gelingt es nicht eine .dll während der Laufzeit zu laden.
Ich will eine .dll laden wo ich aber noch nicht weiß wo die .dll liegt. D.h. ich suche mir beim laden meiner windows form den Pfad zur dll und will dann die gewünschte dll laden, wenn ich auf meiner WIndows Form einen Button drücke.

So funktioniert das ja nicht:
Code:
 [DllImport("PfadZurDll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Decrypt(
            string a,
            int b,
            StringBuilder c,
            int d,
            ref int e);

Jetzt habe ich ein bisschen im Internet herumgesucht und habe folgendes Gefunden:
Code:
public delegate int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint type);
private void button2_Click(object sender, EventArgs e)
{
  IntPtr handle = LoadLibrary("user32.dll");
  IntPtr funcPtr = GetProcAddress(handle, "MessageBoxA");

  MessageBox messageBox = (MessageBox)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(MessageBox));
  messageBox(IntPtr.Zero, "Hello World.", "Caption", 0);

  FreeLibrary(handle);
}

So würde das bei mir aussehen:
Code:
IntPtr handle = LoadLibrary("C:\\decryption.dll";);
IntPtr funcPtr = GetProcAddress(handle, "Decrypt";);
FreeLibrary(handle);

Nur wie kann ich da jetzt meine Funktion public static extern int Decrypt(....) aufrufen?

Danke schonmal!
 
Hallo,

das Beispiel, was du gefunden hast, zeigt doch schon wie es funktioniert. Du musst einen Delegaten bauen und dann mit Marshal.GetDelegateForFunctionPointer arbeiten:
C#:
internal delegate DecryptFunc( [MarshalAs(UnmanagedType.LPStr)]String a,
                               int b,
                               [MarshalAs(UnmanagedType.LPStr)]StringBuilder c,
                               int d,
                               ref int e );

IntPtr handle  = LoadLibrary("C:\\decryption.dll";);

if( handle != IntPtr.Zero )
{
    IntPtr funcPtr = GetProcAddress(handle, "Decrypt");
    
    if( funcPtr != IntPtr.Zero )
    {
        DecryptFunc Decrypt = (DecryptFunc)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(DecryptFunc));
        
        try
        {
            Decrypt( ... );
        }
        catch( Exception e )
        {
            // Fehlerbehandlung
        }            
    }
    
    FreeLibrary(handle);
}
Gruß
MCoder
 
Hallo MCoder,
Danke erstmal für deine Antwort!

Code:
        internal delegate DecryptFunc( [MarshalAs(UnmanagedType.LPStr)]String a,
                               int b,
                               [MarshalAs(UnmanagedType.LPStr)]StringBuilder c,
                               int d,
                               ref int e );

Ich schaff es nicht die funktion zu deklarieren.. da kommt die ganze zeit :"Fehler: Bezeichner erwartet" :suspekt:

Man bin ich dumm:
Code:
        internal delegate  int DecryptFunc( [MarshalAs(UnmanagedType.LPStr)]String a,
                               int b,
                               [MarshalAs(UnmanagedType.LPStr)]StringBuilder c,
                               int d,
                               ref int e );


EDIT: Funktioniert prima! Danke MCoder.
 
Zuletzt bearbeitet:
Ich könnte jetzt behaupten, ich habe den Rückgabewert absichtlich vergessen, um festzustellen, ob du mitdenkst :):)
 
Zurück