C # вызывает Delphi DLL (которая загружает дополнительные библиотеки DLL) FaultExecutionEngineError - PullRequest
1 голос
/ 14 марта 2019

У меня есть приложение 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 попыток.Количество попыток было согласовано между попытками.Если я изменю код, количество успешных попыток изменилось.

1 Ответ

0 голосов
/ 15 марта 2019

Мне нужно поблагодарить Дэвида за это. Я заглянул в комментирующие разделы кода _LoadLibraries, чтобы посмотреть, что я могу опубликовать здесь.
При этом я обнаружил проблему. В моем собственном коде _LoadLibraries передает строку (имя файла ini) в Delphi.DLL. Эта строка не была передана правильно. Я не думал смотреть на _loadLibraries, потому что ошибка была вызвана при вызове функции CallGo.

Так что ответом является проверка каждой точки входа в вашу DLL, ошибка может быть вызвана чем-то, что вы вызывали ранее.

...