【问题标题】:IIS ASP.NET MVC and dllimport calls lock the file preventing future deploymentIIS ASP.NET MVC 和 dllimport 调用锁定文件,防止未来部署
【发布时间】:2017-05-24 02:31:34
【问题描述】:

所以我有一个处理视频文件上传的 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 调用进行开发的常用方法是什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2013-01-30
      • 2023-03-14
      • 2015-07-03
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多