Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IIS ASP.NET MVC和dllimport调用锁定文件,防止将来部署_C#_Asp.net_Asp.net Mvc_Dllimport - Fatal编程技术网

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

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\

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

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

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