我的目标是通过 P/Invoke 从 ASP.NET 应用程序调用本机 DLL。到目前为止,我可以成功地从控制台应用程序调用 DLL,甚至可以从运行在 HttpListener 上的 OWIN 服务器调用,该服务器托管在 Azure WorkerRole 中。
当我尝试在简单的 ASP.NET 应用程序或 Azure WebRole 中托管完全相同的代码时,就会出现问题。在这种情况下,对 DLL 的调用会引发 AccessViolationException。
根据我的研究,看起来问题可能来自本机 DLL 不是线程安全的事实——即使在控制台应用程序中尝试从并发线程调用它的测试也会抛出 AVE,这表明它不是线程——确实安全。因此,我正在与 DLL 的作者核实。
但与此同时,我仍然想知道这是否真的是 ASP.NET/IIS 崩溃的根本原因,因为在我的测试期间,我一次只执行一个请求。所以等待线程安全得到修复,我想知道你们是否知道其他可能导致 P/Invoke 在 ASP.NET/IIS 中失败的具体情况。
更新
根据我的大量测试,结果证明崩溃是由 DLL 试图加载外部文件引起的。在非 IIS 应用程序中,将这些文件放在与 DLL 相同的文件夹级别就可以了;但例如在我的开发机器上,在 IIS 上运行的相同代码会尝试在“C:\Program Files (x86)\IIS Express”中查找文件。
所以我现在的问题是:有没有办法控制一个简单的路径,File.Open
如果没有,有没有办法获得默认路径,以便我可以在启动时复制所需的文件?
谢谢