c# - C# 调用 Delphi DLL(加载额外的 dll)FaultExecutionEngineError
问题描述
我有一个 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 中调试这些?
德尔福:
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 的每个入口点,编组错误可能是由你之前调用的东西引起的。
推荐阅读
- kubernetes - 无法访问 Kubernetes 服务 - 连接被拒绝
- tabulator - 无法使用制表符中的 fa 图标隐藏整列
- cookies - Typo3 Fluid (DCE) 访问 Cookie
- ios - 为什么 react-native 的 onLayout 在 ios 中以随机顺序出现?
- c# - 值对象弄乱了 Ef 核心 linq 查询
- php - 正则表达式中的错误 0 以排除具有类的图像
- google-cloud-platform - 如何正确设置 Anthos 配置管理?
- python - 在装饰器中使用 partial 时自我丢失
- c# - 迁移到 dotnet Core 3.1 后未找到 UseSpaStaticFiles()
- java - 在 Visual Studio Code 中配置 JDK