Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Library für dyn. Laden von DLLs in .Net (https://www.delphipraxis.net/69344-library-fuer-dyn-laden-von-dlls-net.html)

Elvis 13. Mai 2006 23:38


Library für dyn. Laden von DLLs in .Net
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin, das hier ist ein Teil einer Lib an der ich gerade arbeite.
Eigentlich sollte sie zur Laufzeit unmaged Exports ermöglichen, aber hier stellt sich der Marshaler bzw. der Jitter noch quer.
Was aber bereits funktioniert ist das dyn. Laden von DLLs. Das ist wahrscheinlich gerade für Benutzer vom BDS interessant, da es erst in 2.0 die Möglichkeit gibt das überhaupt zu tun.
Es it aber auch in 2.0 mit Marshal.GetDelegateFromFunctionPointer ein wenig friemelig, da man die DLL nicht mehr ohne weiteres entladen kann, bzw. alles zu Fuss machen muss.

Mit der Lib kann man sich also
  • Delgates aus exportieren Funktionen generieren lassen
  • die Bibliothek entladen
  • und durch eine neue Version/andere DLL mit gleichen Funktions namen ersetzen
  • sämtliche generierte Delgates werden die neue DLL benutzen

Zur Demo mal 2 ähnliche Delphi libs, die sich nur im Rückgabewert unterscheiden:
Delphi-Quellcode:
library NativeLib1;

function Add(left, right : Integer) : Integer; stdcall;
begin
  result := left + right;
end;

function SayHello : PChar;
begin
  Result := 'Hello';
end;

exports
  Add,
  SayHello;
end.
Delphi-Quellcode:
library NativeLib2;

function Add(left, right : Integer) : Integer; stdcall;
begin
  result := (left + right) * 1000;
end;

function SayHello : PChar;
begin
  Result := 'Hallo du da';
end;

exports
  Add,
  SayHello;
end.
Der Demo code selbst sollte leicht verständlich sein:
  • 2 DelgateTypen für beide Funktionen
  • Generieren von Delegate instanzen für die exportierten Funktionen
  • Ausgabe der Rückgabewerte
  • Entladen von Lib1 und Laden von Lib2 (mit Reload(libName) ein Einzeiler ;) )
  • Ausgabe der Rückgabewerte durch die neue Lib

Delphi-Quellcode:
AddFunction = function(left, right : Integer) : Integer;
HelloFunction = function : String;
       
implementation

class procedure ConsoleApp.Main;
begin
  using lib := Library.Load('NativeLib1') do
  begin
    var add  := lib.WrapFunction('Add',
                                  typeof(AddFunction)) as AddFunction;
    var hello := lib.WrapFunction('SayHello',
                                  typeof(HelloFunction)) as HelloFunction;
    Console.WriteLine('{0,8}: {1,3} & {2,3} = {3,5}',
                      ['Add',  
                       3,
                       4,
                       add(3, 4)]);

    Console.WriteLine('SayHello: {0}', hello());

    lib.Reload('NativeLib2');

    Console.WriteLine('{0,8}: {1,3} & {2,3} = {3,5}',
                      ['Add',  
                       3,
                       4,
                       add(3, 4)]);
    Console.WriteLine('SayHello: {0}', hello());
  end;
end;
Code:
.
     Add:  3 &  4 =    7
SayHello: Hello
     Add:  3 &  4 = 7000
SayHello: Hallo du da
Scheint zu klappen :stupid: ( :zwinker: )

Have phun!

Edit: Der Beitragseditor zickt ein wenig bei gleichnamigen Anhängen... :freak:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz