Я пытаюсь сослаться на C # DLL в моем проекте InnoSetup. Мне нужна простая функция с одним строковым параметром и строковым возвращаемым значением. Но даже следуя примеру и пробуя разные виды маршалинга, я всегда получаю нарушение прав доступа.
Это мой класс C #:
public class NKToolbox
{
[DllExport("EncryptPassword", CallingConvention.StdCall)]
static string EncryptPassword([MarshalAs(UnmanagedType.LPStr)] string password)
{
File.WriteAllText(@"C:\temp\test.txt", password);
return password.Length.ToString();
}
}
Я поместил File.WriteAllText
, чтобы увидеть, вызывается ли вообще метод. Но нет. Я использую пакет UnmanagedExports от Роберта Гизеке.
И Код установки Inno:
function EncryptPassword(pw: WideString): WideString;
external 'EncryptPassword@files:nktoolbox.dll stdcall';
function InitializeSetup: Boolean;
var
str: WideString;
begin
str := EncryptPassword('sdvadfva');
log(str);
result := False;
end;
В строке str := EncryptPassword('sdvadfva')
я получаю сообщение «Нарушение доступа по адресу ...... Запись адреса .....» Я использую Inno Setup 5.5.9 Unicode.
Я пробовал это с разными операторами маршалинга, которые встречал в других потоках, я пробовал это с ключевым словом out
, с нормальным типом string
и WideString
безнадежно.