2016-11-16 2 views
-1

Я использую .Net Runtime Library для Delphi и загружаю сборку (C#) в моем проекте с успехом. У меня проблема только при попытке получить строковый результат сборки. Мой C# код:Net Runtime Library для Delphi

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

Мой Delphi код:

_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

Строки строк Delphi и C# несовместимы. Если вы собираетесь написать COM-совместимую DLL (которая может быть использована в Delphi, VB, ...), вам нужно использовать типы строк COM, такие как BSTR. – whosrdaddy

+2

Вы хотите использовать 'WideString' на стороне Delphi. Но проще было бы просто использовать 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

Прототип функции Delphi выглядит неправильно. Вы можете проверить? Если запятая на самом деле является точкой с запятой, вы объявляете OutString как вариантный вариант, и вы * не * тестируете InString в любом случае. – Dsm

+0

Да @Dsm. Теперь изменилось. –

+0

Извините, но это еще не правильно. Он не компилируется. Не может быть запятой, где у вас это есть. – Dsm