【问题标题】:Visual Studio 2013.2 can't build because IIS is locking an assemblyVisual Studio 2013.2 无法生成,因为 IIS 正在锁定程序集
【发布时间】:2014-07-06 19:31:26
【问题描述】:

我的 ASP.NET MVC 5 应用程序正在使用我的本地 IIS (Windows 7),在我不得不开始使用 Microsoft.SqlServer.Types NuGet 包之前它运行良好。因为包有本地程序集,所以它们必须在运行时专门加载。

我遇到的问题是,在我重建应用程序并通过浏览器访问它之后,IIS 会加载并锁定本机程序集。如果我进行更改并再次重建,Visual Studio 将失败并说程序集被另一个进程 IIS 锁定。我发现的唯一解决方法是在构建之前继续重新启动 IIS,当我可能需要根据我所做的更改数量在一天内重建数百或数千次时,这是不切实际的。

有没有更合适的解决方法?就像告诉 Visual Studio 不要打扰本机程序集?帮助将不胜感激。

这是我加载程序集的方式:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(X.Mvc.App_Start.SqlServerTypesConfiguration), "LoadAssemblies")]

namespace X.Mvc.App_Start {
    public static class SqlServerTypesConfiguration {
        public static void LoadAssemblies() {
            SqlServerTypes.Utilities.LoadNativeAssemblies(System.Web.Hosting.HostingEnvironment.MapPath("~/bin"));
        }
    }
}

【问题讨论】:

  • 在您的预构建配置中添加一个iis_reset 命令。整个情况虽然很糟糕.. 无论您做什么,您的调试能力都会停止 - 重置 IIS / 应用程序池会导致调试会话的初始加载时间飙升。
  • 正是我需要的,谢谢!我将不得不忍受 IIS 不断地重新加载,但这很好,因为每次我重建之前它都会这样做,而这在一天之内有很多很多次。发布一个答案,这样我就可以给你功劳了。
  • 添加为答案:)

标签: c# asp.net visual-studio iis visual-studio-2013


【解决方案1】:

在构建时防止 IIS 文件锁定的一种简单方法是使用 app_offline.htm,这往往非常有效:

参考:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/app-offline?view=aspnetcore-6.0

例如,如果 IIS 指向您的 asp.net 核心项目文件夹,请使用变量 $(ProjectDir),如下所示

Pre-Build
echo "Build in Progress" > "$(ProjectDir)\App_Offline.htm"

Post-Build
del "$(ProjectDir)\App_Offline.htm"

其他有用的构建变量:https://docs.microsoft.com/en-us/cpp/build/reference/common-macros-for-build-commands-and-properties?view=msvc-170

Visual Studio 2022:

【讨论】:

    【解决方案2】:

    可以单独重新启动特定的应用程序池,而不是重新启动整个 IIS。我在构建后事件中使用以下脚本。

    %SYSTEMROOT%\System32\inetsrv\appcmd stop apppool /apppool.name:"YOUR_APPPLICATION_POOL_NAME"
    xcopy   "$(OutDir)*"  "C:\inetpub\wwwroot\myapp\" /Y /S
    %SYSTEMROOT%\System32\inetsrv\appcmd start apppool /apppool.name:"YOUR_APPPLICATION_POOL_NAME"
    

    【讨论】:

      【解决方案3】:

      根据评论 - 我的建议是在解决方案的预构建配置步骤下放置一个 iis_reset 命令:

      【讨论】:

      • 是的,我在预构建中添加了iisreset /stop,在构建后添加了iisreset /start
      • 我建议只在预构建事件中回收您的应用程序池,使用以下内容:appcmd recycle apppool /apppool.name: MyApplicationPool
      猜你喜欢
      • 2017-02-11
      • 2014-03-16
      • 2011-03-23
      • 1970-01-01
      • 2014-07-16
      • 2017-07-22
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多