У меня есть приложение C # (VS 2017.Net 4.6.1), которое передает строку в DLL-библиотеку Delphi (Delphi 10.2), которая обрабатывает входные данные и возвращает выходные данные.
Я получаю сообщение об ошибке FaultExecutionEngineError "Общие источники этогоошибка включает в себя ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke ".
У меня есть несколько вопросов:
Если My Delphi DLL скомпилирована с IMAGE_FILE_LARGE_ADDRESS_AWARE, будет ли мое c # приложение также должно быть скомпилировано с editbin/ largeaddressaware?
Может ли моя Delphi DLL загрузка дочерних DLL вызывать ошибку FaultExecutionEngineError?В моем тесте я на самом деле не вызываю ничего в дочерних DLL, кроме их начального запуска.
Есть ли инструмент для их отладки в Delphi?
Delphi:
procedure Go(Inputs : WideString; var Rates : WideString); stdcall;
begin
Rates := Inputs + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
end;
c #
[DllImport("DelphiDLL.dll",
CharSet = CharSet.Unicode,
EntryPoint = "LoadLibraries")]
public static extern void _LoadLiabraries(
out int res);
[DllImport("DelphiDLL.dll",
CharSet = CharSet.Unicode,
EntryPoint = "Go")]
public static extern void _Go(
[MarshalAs(UnmanagedType.BStr)]
string Inputs,
[MarshalAs(UnmanagedType.BStr)]
out string Outputs);
public static string CallGo(string Inputs) {
string outputs;
_Go(Risk, out outputs);
return outputs;
}
Если я запускаю этот код:
{
string inputs = "Test Input";
int i = 0;
do {
string output = CallGo(inputs);
Console.WriteLine(String.Format("{0} {1} {2}", i, inputs, output)
} while (i++ < 10000)
}
Я не получаю сообщение, но если я запускаю это:
{
int llres = 0;
_LoadLibraries(llres);
string inputs = "Test Input";
int i = 0;
do {
string output = CallGo(inputs);
Console.WriteLine(String.Format("{0} {1} {2}", i, inputs, output)
} while (i++ < 10000);
}
Я получаю ошибку после N попыток.Количество попыток было согласовано между попытками.Если я изменю код, количество успешных попыток изменилось.