2016-11-16 51 views
-1

我使用德爾福的.Net運行時間庫,並在我的項目中成功加載程序集(C#)。我只有在試圖從程序集中獲取字符串結果時纔有問題。 我的C#代碼是:德爾福的網絡運行時間庫

[DispId(0)] 
public int Add(int a, int b) 
{ 
    return a + b; 
} 
[DispId(1)] 
public string GetProtectedID(string InString) 
{ 
    return "12345"; 
} 

我的德爾福代碼:

_SISign = dispinterface 
['{AAFE8566-37E1-485B-9727-7223F7731F19}'] 
    function Add(a, b : Integer) : Integer; dispid 0; 
    function GetProtectedID(InString: String): String; dispid 1; 
    end; 

var 
    oSISign : _SISign; 
begin 
    WriteLn(oSISign.Add(10, 20)); 
    WriteLn(oSISign.GetProtectedID('SomeText')); 
end; 

第一線返回30,第二一無所獲。

+1

你確定正確版本程序集被加載? –

+2

德爾福字符串和C#字符串類型不兼容。如果你打算寫一個兼容COM的DLL(可以在Delphi,VB中使用),你需要使用COM字符串類型,比如BSTR。 – whosrdaddy

+2

你會想在Delphi端使用'WideString'。但使用Robert Giesecke的UnmanagedExports可能會更簡單。 –

回答

-2

我發現在C#中的變化,現在

一些解決方案

public integer GetProtectedID(string InString, out string OutString) 
{ 
    OutString = "Result HERE"; 
    return 0; 
} 

在Delphi中我改

_SIXmlSign = dispinterface 
    ['{4a674fd3-244f-4802-9b1d-9eb0b0efb282}'] 
    function GetProtectedID(InString: String; var OutString: String): Integer; dispid 1; 
end; 

現在代碼工作

+0

德爾福函數原型看起來不對。你可以檢查一下嗎?如果逗號實際上是分號,那麼您將OutString聲明爲變體類型,並且在任何情況下您都不*測試InString。 – Dsm

+0

是@Dsm。現在改變了。 –

+0

對不起,但這仍然不正確。它不會編譯。你所擁有的地方不能有逗號。 – Dsm