C#调用Delphi DLL(加载其他dll)FaultExecutionEngineError

时间:2019-03-14 20:53:03

标签: c# delphi dll

我有一个C#应用程序(VS 2017 .Net 4.6.1),它将字符串传递给处理输入并返回输出的Delphi DLL(Delphi 10.2)。
我收到了FaultExecutionEngineError“此错误的常见来源包括COM-interop或PInvoke的用户封送处理错误”。

我有几个问题:

如果我的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 :(得分:0)

我要感谢大卫。 我进入_LoadLibraries代码注释部分,以查看可以在此处发布的内容。
这样做我发现了问题。在我的实际代码中,_LoadLibraries将字符串(ini文件名)传递给Delphi.DLL。该字符串未正确传递。我不希望查看_loadLibraries,因为调用CallGo函数时抛出了错误。

因此,答案是检查DLL的每个入口点,编组错误可能是由您先前调用的内容引起的。