【问题标题】:Clearscript files cannot be found on host在主机上找不到 Clearscript 文件
【发布时间】:2014-06-11 16:24:08
【问题描述】:

与许多其他人一样,我在部署 ASP.Net MVC 应用程序时收到以下错误:

无法加载 V8 接口程序集;验证您的应用程序是否安装了以下文件:ClearScriptV8-32.dll、ClearScriptV8-64.dll、v8-ia32.dll、v8-x64.dll

安装 Clearscript 是为了减少动态转换页面请求的文件。

我已经在 ISS Express 和 ISS 本地测试了我的应用程序,没有任何问题。

正如此处http://clearscript3.rssing.com/chan-14849437/all_p12.html 所建议的那样,我还将缺少的代码库作为资源包含在我的项目中。

ClearScriptV8-32.dllClearScriptV8-64.dllv8-ia32.dllv8-x64.dll 都包含在 bin 文件夹中的 ClearScript.V8 文件夹中。删除此文件夹并不能解决问题。

无计可施。任何帮助表示赞赏。

【问题讨论】:

  • 可能值得使用 NuGet 包:nuget.org/packages/ClearScript.V8
  • 感谢您的建议,但没有任何区别。我对项目进行了建议的更改 - 删除包创建的构建步骤并将二进制文件添加到内容文件夹 - 没有任何运气。相反,出现了一个不同的错误,说它正在为错误的平台加载程序集(不匹配)。
  • 确保这些 DLL 不在您的 bin 目录中的任何位置。将它们放在应用程序的根目录中并将它们设置为“请勿复制”。如果您已经这样做了,并且您的应用程序可以在您的开发 PC 上运行,但在部署时失败,则问题可能出在权限上;检查部署应用程序池的身份。
  • 感谢您的建议,但即使在部署时在本地一切正常,但仍会出现问题。我无法检查身份,因为目标主机是共享的廉价品种之一。在上传和删除对 bundletransformer/clearscript 的所有引用之前,我已经在本地转换了较少的文件。
  • 在网站上使用 Web 部署后,我遇到了同样的问题。使用 v8 引擎进行 .less 编译。它似乎在错误的文件夹中查找:不在/bin/ClearScript.V8/

标签: asp.net-mvc-4 iis deployment shared-hosting clearscript


【解决方案1】:

可能有点晚了,但这可能会帮助其他人来这篇文章。

当您没有在托管服务器上安装 Visual C++ Redistributable for Visual Studio 2012 或更高版本时,这是一个常见错误

http://www.microsoft.com/en-gb/download/details.aspx?id=30679

【讨论】:

  • +1;这里的关键点与this answer 相同,因为“找不到指定的模块”实际上并不意味着“找不到这个DLL”,而是“找不到这个DLL的依赖项”。 (在这两种情况下,它都是 VC++ 2012 运行时,但这是巧合)。
【解决方案2】:

如果您在具有 IIS 角色的 Windows Server 2012 上进行部署,您应该做两件事来让 ClearScriptV8 运行:

  1. 正如@no1sprite 指出的那样:

您必须在托管服务器上安装 Visual C++ Redistributable for Visual Studio 2012 或更高版本: http://www.microsoft.com/en-gb/download/details.aspx?id=30679

  1. 确保将 ClearScript.dll 放在网站的 bin\ 文件夹中,并且将 ClearScriptV8-64.dllv8-x64 .dll 进入 bin\ClearScript.V8

可选,用于 32 位应用程序/平台:

  1. 如果您使用 32 位平台,请将 ClearScriptV8-32.dllv8-ia32.dll 放在网站的 bin\ClearScript.V8\文件夹。 此外,在 IIS 管理器中,右键单击站点的 应用程序池,然后选择 “高级设置...”。将属性“启用 32 位应用程序”设置为 true

【讨论】:

  • 太棒了,救了我的命。在我的情况下,ClearScript.V8 文件夹在我的项目中,但里面的所有 dll 都需要在文件属性中标记为“始终复制”或“如果更新则复制”,以便它们正确部署。
  • @parliament 在我们的例子中,我们必须在应用程序池高级设置下禁用(设置为 false)启用 32 位应用程序。感谢您的评论,因为它让我走上了正确的道路,并想在这里发布它以防它可能对其他人有所帮助。
【解决方案3】:

需要明确的是,此异常并不总是由缺少 ClearScriptV8-32.dllClearScriptV8-64.dllv8-ia32.dllv8-x64.dll 引起。通常问题是找不到由上述 dll 之一引用的 dll。如果服务器上有适当的 dll,安装适当的 Visual C++ Redistributable 通常可以解决此传递依赖问题。

根据项目论坛ClearScript no longer supports Visual Studio 2012。这意味着需要在您的服务器上安装的 Visual C++ Redistributable 版本取决于您的项目正在使用的 ClearScript 版本:

【讨论】:

    【解决方案4】:

    原因是 asp.net 会立即加载 /bin 目录中的所有库。 我添加了以下规则来忽略 Clearscript 程序集,它起作用了

    <configuration>
        <system.diagnostics>
            <trace autoflush="true" />
        </system.diagnostics>
        <system.web>
            <compilation>
                <assemblies>
    
                    <remove assembly="ClearScriptV8-64" />
                    <remove assembly="ClearScriptV8-32" />
                   ....
                </assemblies>
            </compilation>
    

    ...

    【讨论】:

    • 这是如何工作的?找不到文件,所以我们“删除”它们?抓挠头。
    • 这很好,但有人可以解释一下它是如何工作的!
    【解决方案5】:

    没有一个答案对我有用。它是一个 Windows 服务应用程序。

    基于accepted answer; 我删除了 v8-ia32.dllClearScriptV8-32.dll (因为我的应用程序是针对 x64

    它解决了这个问题。

    【讨论】:

      【解决方案6】:

      这是用 clearscript v8 启动某个项目的几秒钟时间,很好,我记得第一次出现的问题是什么。正在加载 Native Lib v8。

      您可能会在 GETTING STARTED 或类似主题中的某个地方想到,ClearScript 的开发人员应该提到您需要将 V8 原生库放在子文件夹“ia32”或“x64”(分别为 Platform x86 或 Platform x64)中。 创建上面的子文件夹。并将原生 v8 库放在那里(32 位到 'ia32',64 位到 'x64')。

      我猜他们忘了写下这个想法。 就像提醒... 从上次帮助我跟踪问题的加载程序中获取的源代码......

      private static IntPtr LoadNativeLibrary()
      {
          var suffix = Environment.Is64BitProcess ? "x64" : "ia32";
          var fileName = "v8-" + suffix + ".dll";
          var messageBuilder = new StringBuilder();
      
          var paths = GetDirPaths().Select(dirPath => Path.Combine(dirPath, deploymentDirName, fileName)).Distinct();
          foreach (var path in paths)
          {
              var hLibrary = NativeMethods.LoadLibraryW(path);
              if (hLibrary != IntPtr.Zero)
              {
                  return hLibrary;
              }
      
              var exception = new Win32Exception();
              messageBuilder.AppendInvariant("\n{0}: {1}", path, MiscHelpers.EnsureNonBlank(exception.Message, "Unknown error"));
          }
      
          var message = MiscHelpers.FormatInvariant("Cannot load V8 interface assembly. Load failure information for {0}:{1}", fileName, messageBuilder);
          throw new TypeLoadException(message);
      }
      

      奇怪的是,这个加载器应该在调试环境中抛出更有意义的消息,但它没有。相反,我们有:FileNotFoundException,带有消息“无法加载文件或程序集 'ClearScriptV8' 或其依赖项之一。系统找不到指定的文件。”。猜猜其他地方的代码中还有另一个类似的加载器,它实际上不使用 LoadLibrary 但回退到 .Net 默认加载器,给出无意义的异常。

      希望这有助于其他人解决类似问题。

      【讨论】:

        【解决方案7】:

        此处发布的答案对我不起作用,但确实如此: Visual Studio -> 工具 -> 选项 -> 项目和解决方案 -> Web 项目 -> 勾选“为网站和项目使用 64 位版本的 IIS Express”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-30
          • 2020-07-08
          • 2018-03-03
          • 2021-04-21
          • 1970-01-01
          相关资源
          最近更新 更多