AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Library für dyn. Laden von DLLs in .Net
Thema durchsuchen
Ansicht
Themen-Optionen

Library für dyn. Laden von DLLs in .Net

Ein Thema von Elvis · begonnen am 13. Mai 2006
Antwort Antwort
Elvis
Registriert seit: 25. Nov 2005
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 ( )

Have phun!

Edit: Der Beitragseditor zickt ein wenig bei gleichnamigen Anhängen...
Angehängte Dateien
Dateityp: dll rg.dllhandling_467.dll (12,0 KB, 3x aufgerufen)
Dateityp: dll rg.dllhandling_876.dll (21,5 KB, 1x aufgerufen)
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
 
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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