P / Invoke在ASP.NET中提供AccessViolationException

时间:2013-10-27 09:30:09

标签: asp.net iis

我的目标是通过P / Invoke从ASP.NET应用程序调用本机DLL。到目前为止,我可以从Console应用程序成功调用DLL,甚至可以从Azure WorkerRole中托管的HttpListener上运行的OWIN服务器成功调用。

当我尝试在ASP.NET / IIS中托管完全相同的代码时,无论是在简单的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寻找的路径,如果没有,是否有办法获取默认路径,以便我可以在那里复制所需的文件在启动时?

由于

2 个答案:

答案 0 :(得分:0)

您观察到的只是表明您使用相对路径。这意味着当在IIS Express(而不是IIS)下运行时,进程会尝试在C:\Program Files (x86)\IIS Express下搜索,因为它假定这是解释相对路径时使用的基本目录。

您应始终使用绝对路径而不是相对路径,然后不会发生此问题。

http://msdn.microsoft.com/en-us/library/ms178116(v=vs.100).aspx

答案 1 :(得分:0)

请不要在每个应用启动时复制文件,只能向南移动。

更好的解决方案是让DLL的提供程序添加一些代码来检查Windows注册表中的路径值。如果该值存在于注册表中,则DLL将尝试从该值中的路径加载其关联的库;否则它会回退到尝试从DLL的当前目录加载它们。