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

IIS ASP.NET MVC and dllimport calls lock the file preventing future deployment

所以我有一个 ASP.NET MVC 项目处理视频文件上传,我使用 MediaInfo 库 (C++) 以及包含的 C# 包装器(使用 DllImport 函数)来确定视频持续时间。我将 MediaInfo.dll 文件添加到我的项目中,并将 "copy to output directory" 设置为始终。一切正常。

我的问题是,当我重建(从 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) 和项目的其余部分都可以更新而不必这样做时。

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

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

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

阅读更多有关该主题的内容后,如果您想控制 DLL loading/unloading 进程,则无法使用 DllImport 来完成。您需要使用 GetProcAddress 来调用函数。您还可以创建一个 C++/CLI 库。

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