2014-03-19 11 views
0

我使用RobertGiesecke的託管輸出NuGet包,以便把它在delphi5 Win32應用程序導出一個.NET的DLL函數返回自定義類型的實例。傳遞和返回標準類型時 一切工作完美(字符串,整數......)。 但我嘗試按照編組樣品(https://sites.google.com/site/robertgiesecke/Home/uploads#TOC-Marshalling-sample)返回在C#中定義的自定義類型的實例,但我不管理,以正確訪問在delphi實例。不能與非託管的出口(羅伯特·捷)

在Delphi中,我的代碼是:

type 
    TCreateSampleInstance = procedure(var sample: PSample); stdcall; 

    TSample = record 
    Name: WideString; 
    end; 
    PSample = ^TSample; 

var 
    sample: PSample; 
    dllHandle: Cardinal; 
    proc4: TCreateSampleInstance; 
begin 
    dllHandle := LoadLibrary('myDotNetAssembly.dll'); 

    if dllHandle <> 0 then 
    try 
    @proc4 := GetProcAddress(dllHandle, PChar('CreateSampleInstance')); 
    if Assigned(proc4) then 
    begin 
     proc4(sample); 
     // how to access sample properties ? 
     Caption := sample^.Name; // Name = '' here instead of 'Test'... 
    end; 
    finally 
    FreeLibrary(dllHandle); 
    end; 
end; 

預先感謝您的幫助!

+2

FWIW,在互操作問題中,您應該始終顯示互操作邊界的兩側 –

回答

2

你可能已經得到額外的間接層。 Delphi代碼編組指向指向記錄的指針。我期望C#代碼編組一個指向記錄的指針。我期望這不僅僅是因爲它需要相當多的努力來編組指向C#中記錄的指針。

我的猜測是,C#代碼是這樣的:

public static void CreateSampleInstance(out Sample sample) 

在這種情況下你需要它寫這樣的:

C#

public struct Sample 
{ 
    [MarshalAs(UnmanagedType.BStr)] 
    string Name; 
} 

[DllExport] 
public static void CreateSampleInstance(out Sample sample) 
{ 
    sample.Name = "boo yah"; 
} 

德爾福

type 
    TSample = record 
    Name: WideString; 
    end; 

procedure CreateSampleInstance(out sample: TSample); stdcall; 
    external 'myDotNetAssembly.dll'; 

在德爾福的一面,我與簡單的負載時鏈接寫的。如果這是您的需求,您可以隨時適應運行時鏈接。

+0

謝謝,如果我使用.NET結構作爲參數/返回,它將起作用。有沒有解決方案來傳遞.NET自定義類實例?我使用https://sites.google.com/site/robertgiesecke/Home/uploads#TOC-Marshalling-sample – Guimcha

+0

提供的示例,您是否知道如何返回Sample數組? – Guimcha

+0

好。如果這回答你的問題,你可能會考慮接受它。您不能傳遞.net類實例,因爲您只能在.net代碼中使用它們。您可以通過COM兼容接口。我知道如何處理數組,但這應該是一個新問題。 –