我有一个需要从64位.NET核心应用程序调用的32位dll。
我的方法是创建一个基本上如下所示的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")
当我运行consoleapp.exe文件时,它会打印"我开始了!"正如预期的那样,x.dll的操作也正确执行。
然而,当我从process.Start()调用consoleapp.exe时,我得到了一个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。直接
答案 0 :(得分:1)
成功
public static extern x(int var);
和/或尝试将其指定为void
public static extern void x(int var);