加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:16:55 所属栏目:百科 来源:网络整理
导读:我有一个32位的DLL,我需要从64位.NET核心应用程序调用. 我的方法是创建一个基本上如下所示的32位控制台应用程序: [DllImport("x.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]static extern int x(int var);static void Ma
我有一个32位的DLL,我需要从64位.NET核心应用程序调用.

我的方法是创建一个基本上如下所示的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的操作也正确执行.

但是,当我从process.Start()调用consoleapp.exe时,在“I Started!”之后抛出了SEHException.打印到输出(即当DllImport部分被击中时).

以下是我在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为null) – 某种指南可能对我有帮助.

附加到异常的消息是“外部组件引发了异常”.

x.dll文件读取CSIDL_COMMON_APPDATA下的子目录中的文件.当我直接运行程序时,此变量是正确的,并且来自Web应用程序 – 在Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)上使用的console.log)
读取文件内容以获取数据库位置和凭据以从特定数据库读取.如果任何部分失败,x.dll将返回错误代码,而不是异常,我通过更改文件,数据库名称,记录号等中的凭据进行了双重检查,并且运行时没有抛出SEHExceptions.直.

解决方法

做了

public static extern x(int var);

和/或尝试将其指定为无效

public static extern void x(int var);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读