IIS ASP.NET MVC和dllimport调用会锁定该文件,以防未来部署

所以我有一个处理视频文件上传的ASP.NET MVC项目,我使用MediaInfo库(C ++)以及包含的C#包装(使用DllImport函数)来确定视频持续时间。 我将MediaInfo.dll文件添加到我的项目中,并将“复制到输出目录”设置为始终。 一切都很完美。

我的问题是,当我重建(从Visual Studio)或重新部署项目到我的生产环境,它失败,因为文件被锁定。

Unable to copy file "SourcesMediaInfoMediaInfo.dll" to "binMediaInfo.dll". The process cannot access the file "binMediaInfo.dll" because it is being used by another process.

当然,这是因为IIS仍在运行。 我知道我可以停止AppPool,重建并重新启动它,但是每次开发时都会很麻烦,而且生产中的更新会变得复杂。 尤其是当每个其他DLL(.NET)和项目的其余部分都可以更新而无需这样做。

所以我尝试了这里和这里提出的方法。 每次我想扫描视频时,我都使用LoadLibrary()并在调用FreeLibrary()之后,直到它返回false。 FreeLibrary部分工作,解锁文件。 但是第二次调用该方法时,它会调用LoadLibrary,然后在第一次调用DllImport函数时,我得到一个InvalidOperationException异常,并导致进程崩溃。

我觉得自己做得太过分了,感觉不太正常,我想知道自己是否完全走错了路。

在通常的Visual Studio / MVC环境中开发使用非托管dll调用的常用方法是什么?


在阅读了更多关于这个主题之后,如果你想控制DLL的加载/卸载过程,就不能用DllImport来完成。 您需要使用GetProcAddress来调用这些函数。 你也可以创建一个C ++ / CLI库。

就我而言,我设法通过每次创建一个不同的AppDomain并强制FreeLibrary调用和AppDomain.Unload来“解决”问题。 这会导致DllImport成功重新加载dll,因为它是不同的AppDomain。

链接地址: http://www.djcxy.com/p/44541.html

上一篇: IIS ASP.NET MVC and dllimport calls lock the file preventing future deployment

下一篇: Mixed mode assembly loading in asp.net