C# dllimport 在 Process.Start 调用时抛出 SEHException

本文关键字:SEHException 调用 Start dllimport Process | 更新日期: 2023-09-27 17:57:01

我有一个 32 位的 dll,需要从 64 位的 .NET Core 应用程序中调用它。

我的方法是创建一个 32 位控制台应用程序,基本上看起来像这样:

[DllImport("x.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int x(int var);
static void Main(string[] args)
{
    Console.log("I Started!");
    int y = x(0);
    //do something with y.
}

然后使用Process.Start("consoleapp.exe")从我的 64 位核心应用程序调用它

当我运行 consoleapp.exe 文件时,它会按预期打印"我开始!",并且 x.dll 的操作也正确执行。

但是,当我调用控制台应用程序时.exe从进程。Start() 在"I Started!"打印到输出后(即当 DllImport 部分被点击时),我得到了一个 SEHException。

这是我如何在64位应用程序中启动该过程的方式

ProcessStartInfo p = new ProcessStartInfo("consoleapp.exe");
Process process = Process.Start(p);
process.WaitForExit();

我已经尝试过用户模拟并以管理员身份运行 Process 对象,但它不起作用。

dll 文件 x.dll

肯定在 consoleapp.exe 的工作目录中,因为我让进程在工作目录上做了一个 console.writeline(),它与 x.dll 文件所在的位置相匹配。

SEHException 错误代码为 0x80004005,E_FAIL"未指定的故障"


更新:根据要求,堆栈跟踪为:

  at Consoleapp.Consoleapp.x(int32 var)
  at Consoleapp.Consoleapp.Main(String[] args)

不知道这对你有什么帮助。如果您的意思是外部异常的堆栈跟踪,我无法弄清楚如何访问它(InnerException 为空) - 某种指南可能有助于我做到这一点。

附加到异常的消息是"外部组件引发了异常"。

x.dll 文件读取 CSIDL_COMMON_APPDATA 下子目录中的文件。当我直接运行程序时,此变量是正确的,并且从 Web 应用程序 - 使用的控制台.log在Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))读取文件内容以获取要从特定数据库读取的数据库位置和凭据。如果其中任何部分失败,x.dll 将返回错误代码,而不是异常,我已经通过更改文件、数据库名称、记录号等中的凭据来仔细检查这种情况,并且在直接运行时没有抛出 SEHExceptions。

C# dllimport 在 Process.Start 调用时抛出 SEHException

Make it

public static extern x(int var);

和/或尝试将其指定为 void

public static extern void x(int var);