DllImport - 在测试上下文中工作,但在 ASP.NET MVC 中不起作用



我正在开发一个 ASP.NET MVC应用程序,该应用程序通过DllImport调用第三方库。

最初,在测试 MSTest DllImport的工作方式时,我编写了一些简单的测试以确保我正确使用它。 我能够毫无问题地使用整个 API。由于抽象是围绕导入构建的,测试继续表明导入按预期工作,并且我能够与外部 API 通信。

现在我开始在 MVC(而不是 MSTest)的上下文 ASP.NET 访问该库。 每当调用导入时,都会遇到以下异常:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

为了在MVC中使用DllImport,我应该做些什么 ASP.NET?

您可以在下面找到初始化导入的示例。

[DllImport("pcrsrv32.dll", EntryPoint = "PCRSInitSrv", CallingConvention = CallingConvention.Cdecl)]
public static extern int InitSrv(string callerName, string iniFile);

当谈到它在第三方库中的外观时,我们只提供了以下 C 函数声明的外观:

HRESULT _PCRSFN PCRSInitSrv(const char *name, const char *iniFile);

在使用进程监视器分析在 MSTest 中访问外部代码与 ASP.NET MVC 中的外部代码之间的差异后,我发现 ASP.NET MVC 无法找到外部代码所依赖的许多文件。查找文件时,检查了PATH中包含的所有文件夹,但没有检查我在发送到外部软件的ini文件中提供的文件夹。 通过 MSTest 运行时,立即找到所有文件,没有问题。

最后,我能够通过将文件夹路径添加到我的PATH变量来"修复"问题。 我对修复并不完全满意,但它现在可以工作了。

Windows上,默认的调用约定是StdCall

尝试使用:调用约定 = CallingConvention.StdCall

相关内容

最新更新