我有一个C#应用程序(VS 2017 .Net 4.6.1),它将字符串传递给Delphi DLL(Delphi 10.2),后者处理输入并返回输出。 我收到一个FaultExecutionEngineError“此错误的常见来源包括COM-interop或PInvoke的用户封送错误”。
我有几个问题:
如果使用IMAGE_FILE_LARGE_ADDRESS_AWARE编译My Delphi DLL,我的c#App还需要用editbin / largeaddressaware编译吗?
我的Delphi DLL加载子DLL是否会导致FaultExecutionEngineError?在我的测试中,除了初始启动之外,我实际上并没有在子DLL中调用任何东西。
是否有工具可以在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次尝试后我收到错误。尝试次数在尝试之间保持一致。如果我更改了代码,则成功尝试次数已更改。
我需要感谢大卫。我查看_LoadLibraries代码注释掉部分以查看我可以在这里发布的内容。 这样做我发现了问题。在我的实际代码中,_LoadLibraries将一个字符串(一个ini文件名)传递给Delphi.DLL。此字符串未正确传递。我没想到要查看_loadLibraries,因为调用CallGo函数时抛出了错误。
因此,答案是检查DLL的每个入口点,编组错误可能是由您之前调用的内容引起的。