How does a Delphi application call an exported function (non-COM) dotNET assembly and have the function return a string?
COM is not a possible solution for my particular application. I have control over both ends of the call.
What I have tried so far - Delphi client side
type
TStrProc = procedure( var x: widestring); stdcall;
function TryIt: string;
var
Handle: THandle;
Proc: TStrProc;
InData: widestring;
OutData: widestring;
begin
Handle := LoadLibrary( 'DelphiToDotNet.dll');
if Handle = 0 then exit;
@Proc := GetProcAddress( Handle, 'StrProc');
if @Proc <> nil then
begin
InData := 'input';
Proc( InData);
OutData := InData;
end;
FreeLibrary( Handle);
result := OutData
end;
dotNET dll side
public class DotNetDllClass
{
[DllExport]
public static string StrProc(ref string s)
{
return "Hello from .Net " + s;
}
}
What works
I can successfully pass integers into and out of dotNET procedures. I can successfully pass strings (widestring on the Delphi side) into dotNET procedures.
What doesn't work
In the above two listings, the string parameter returned is junk. Accessing it causes an AV.
Environment
Delphi XE7, dotNET 4, Win 7, 32 bit application and dll.