2011-02-24 30 views
7

我需要在我的C#代碼中使用Delphi的DLL。德爾福DLL在C#中 - VAR數組作爲參數

我有一些成功使用其他方法與常見的參數時,但在這種情況下,解決方案仍然隱藏。

的DLL文件提出這個聲明:

Function Get_Matrix (var Matrix : array [ 1..200 ] of char) : boolean ; stdcall; 

我試着使用:

[DllImport("DLL.dll")] 
public static extern bool Get_Matrix(ref char[] Matrix); 

沒有成功。一些幫助?

回答

8

你需要做的第一件事就是在C#端使用stdcall

[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall, 
    CharSet=CharSet.Auto)] 

我還希望確保德爾福一邊是交德爾福2009年,因此使用寬字符。如果是這樣,那麼這裏沒有問題。如果你使用的是非Unicode的Delphi,那麼你需要CharSet.Ansi

我可能也對德爾福側返回LongBool

[return: MarshalAs(UnmanagedType.Bool)] 

回.NET方面名帥它。

最後,固定長度陣列需要被不同地編組。固定長度字符數組的標準方法是在.NET端使用StringBuilder,這是您希望編組的。

把它完全和修復你的Delphi語法,給出了:

德爾福

type 
    TFixedLengthArray = array [1..200] of char; 

function Get_Matrix(var Matrix: TFixedLengthArray): LongBool; stdcall; 

C#

[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall, 
    CharSet=CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool Get_Matrix(StringBuilder Matrix); 

static void Main(string[] args) 
{ 
    StringBuilder Matrix = new StringBuilder(200); 
    Get_Matrix(Matrix); 
} 

最後,確保你空終止您的字符串,當你從你的DLL中返回它!

+0

嗨,問題依然存在。這似乎是相對於「字符數組」,當我沒有parametersthe程序仍在運行申報進口,但是當我宣佈char參數, – 2011-02-24 16:58:31

+0

德爾福的版本? – 2011-02-24 17:00:22

+0

嗨,我以前沒有想過。我忘記了陣列編組。我相信更新後的答案會爲你做好這項工作。 – 2011-02-24 17:23:00