我有一个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位Core Application中调用它

当我运行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直。

最佳答案

做了

public static extern x(int var);


和/或尝试将其指定为void

public static extern void x(int var);

09-05 22:18
查看更多