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...