Hi,
ich hab einen in Delphi geschriebenen Parser, der einen String erhält, diesen zerlegt und dann ein Objekt zurückgibt. Dieser Parser soll jetzt auch für .NET zur Verfügung stehen, allerdings liefert der Parser ein Delphi-Objekt zurück. Da .NET aber schließlich mit
COM-Interfaces arbeiten kann, hab ich mir gedacht ich könnte einfach Interfaces verwenden. Die Delphi-Klassen implementieren diese Interfaces, und über die Interfaces kann ich auch aus .NET auf die Objekte zugreifen.
Ich hab dazu mal ein kleines Test-Programm geschrieben, allerdings funktioniert das nicht so wie geplant. Hier die Interface-Deklarationen:
Delphi-Quellcode:
type
{$IFDEF CLR}
[ComImport,
GuidAttribute('
257A2C12-24C4-4A2E-8E34-376D5D185904'),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
{$ENDIF}
IParsedObject =
interface
{$IFDEF WIN32}
['
{257A2C12-24C4-4A2E-8E34-376D5D185904}']
{$ENDIF}
function foo:
String;
stdcall;
end;
{$IFDEF CLR}
[ComImport,
GuidAttribute('
19845562-721E-483D-BB56-55C0B0EDBDCC'),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
{$ENDIF}
IParser =
interface
{$IFDEF WIN32}
['
{19845562-721E-483D-BB56-55C0B0EDBDCC}']
{$ENDIF}
{$IFDEF CLR}
[return: MarshalAs(UnmanagedType.
Interface)]
{$ENDIF}
function Parse(
const s:
string): IParsedObject;
stdcall;
end;
Dann hab ich eine
DLL die im großen und Ganzen so ausschaut:
Delphi-Quellcode:
procedure GetParser(out parser: IParser); stdcall;
begin
parser := TParser.Create();
end;
exports
GetParser;
Und in meinem .NET Programm versuche ich mit diesen Code eine IParser-Instanz zu bekommen:
Delphi-Quellcode:
[DllImport('
..\win32\parser.dll')]
procedure GetParser([MarshalAs(UnmanagedType.
Interface)]
out parser: IParser);
external;
procedure TForm1.Button1Click(Sender: TObject);
var
parser: IParser;
begin
GetParser(parser);
end;
Allerdings erhalte ich dabei eine System.ExecutionEngineException. Mach ich irgendwo was falsch, oder ist mein Ansatz sowieso komplett zum vergessen? Hat irgendwer eine Idee?
LG, Manuel