C# IIS ASP.NET MVC和dllimport调用锁定文件,防止将来部署
因此,我有一个ASP.NET MVC项目来处理视频文件上传,我使用MediaInfo库(C++)以及附带的C#包装器(使用DllImport函数)来确定视频持续时间。我将MediaInfo.dll文件添加到我的项目中,并将“复制到输出目录”设置为“始终”。一切都很完美 我的问题是,当我重建(从VisualStudio)或将项目重新部署到生产环境时,它会失败,因为文件被锁定C# IIS ASP.NET MVC和dllimport调用锁定文件,防止将来部署,c#,asp.net,asp.net-mvc,dllimport,C#,Asp.net,Asp.net Mvc,Dllimport,因此,我有一个ASP.NET MVC项目来处理视频文件上传,我使用MediaInfo库(C++)以及附带的C#包装器(使用DllImport函数)来确定视频持续时间。我将MediaInfo.dll文件添加到我的项目中,并将“复制到输出目录”设置为“始终”。一切都很完美 我的问题是,当我重建(从VisualStudio)或将项目重新部署到生产环境时,它会失败,因为文件被锁定 Unable to copy file "Sources\MediaInfo\MediaInfo.dll" to "bin\
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仍在运行。我知道我可以停止应用程序池、重建并重新启动它,但每次在开发中构建应用程序池时都要这么做,并且会使生产中的更新复杂化。尤其是当每隔一个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