IIS ASP.NET MVC和dllimport调用锁定文件,防止将来部署

时间:2017-05-19 18:55:24

标签: c# asp.net asp.net-mvc dllimport

所以我有一个处理视频文件上传的ASP.NET MVC项目,我使用MediaInfo库(C ++)和附带的C#包装器(使用DllImport函数)来确定视频持续时间。我将MediaInfo.dll文件添加到我的项目中,并将"副本设置为输出目录"永远。一切都很完美。

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

Unable to copy file "Sources\MediaInfo\MediaInfo.dll" to "bin\MediaInfo.dll". The process cannot access the file "bin\MediaInfo.dll" because it is being used by another process.

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

所以我尝试了建议herehere的方法。每次我想要扫描视频时,我都会使用LoadLibrary()并在调用FreeLibrary()之后再返回false。 FreeLibrary部分工作,它解锁文件。但是第二次调用该方法,它调用LoadLibrary,然后在第一个DllImport函数调用时,我得到一个InvalidOperationException并且进程崩溃。

我觉得我过度了事情并且感觉不正常,我想知道我是否完全走错了路。

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

1 个答案:

答案 0 :(得分:1)

在阅读了有关该主题的更多信息后,如果要控制DLL加载/卸载过程,则无法使用DllImport完成。您需要使用GetProcAddress来调用函数。您还可以创建C ++ / CLI库。

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