【问题标题】:Get Visual Studio to highlight Razor syntax with a custom host factoryType获取 Visual Studio 以使用自定义主机 factoryType 突出显示 Razor 语法
【发布时间】:2026-01-01 11:35:01
【问题描述】:

这是场景,我扩展了MvcWebRazorHostFactory,所以我可以在构建时做一些额外的视图魔术。确切的魔法并不重要。

我的 ~\Views\Web.config 中的注册如下所示:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />

项目中有相应的程序集,该程序集的副本位于 \lib 文件夹中,并且我已确认它已按预期复制到 \bin。此外,真正的视图魔法确实会在构建视图时发生,因此 ASP.NET 本身实际上正在查找所有内容。

Visual Studio (2012) 的 Razor 语法突出显示 中的哪些问题。

以上是语法高亮失败的快照。通常,不能找到任何不在命名空间中的直接@using'd(因此得到红色波浪下划线)并且@model 指令不起作用。这表明在 Web.config 中访问我们的 automatically included namespaces 时遇到了一些麻烦。

@model 上的错误提示是“当前上下文中不存在名称‘模型’”。

通过反复试验,我已将根本原因缩小到上述 host 配置部分,尽管我们对 Razor 进行了一些其他调整(例如自定义 pageBaseType),但正是这一行破坏了一切。

到目前为止我尝试过的事情:

  • 强大的程序集命名
  • 在 GAC 中安装程序集

当我的 ~\Views\Web.config 被强烈命名时,最终看起来像这样:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" />

我使用“gacutil -l”根据 GAC 检查了版本、文化和 PublicKeyToken。

我认为另一个可能的故障点是 GAC 本身,因为我的盒子上有大量的 .NET 版本。程序集和网站都是使用 .NET 4.5 构建的(均引用 MVC 4、Razor 2 等)。我在调试时一直使用的gacutil 的路径是Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\gacutil.exe

在筛选根本原因期间,有时我会在视图的第一行收到一条错误消息,其效果是“找不到 StackExchange.MyNamespace.MyFactory”。下划线将是“其他错误”颜色(VS2012 Dark Theme 中的紫色)。我无法可靠地重现它,所以我无法获得屏幕截图。


所以我的问题是,有谁知道如何让 Visual Studio(2012 再次)使用自定义主机工厂正确处理 Razor 视图?

我目前对修复的最佳猜测是做一些非常hacky的Web.config替换,所以我在编辑时有一个配置,在调试时有另一个。不过真的不喜欢这个想法。

看起来这应该可以工作,而 Visual Studio 只是在寻找它需要的东西时遇到了麻烦。我只是不知道那是什么。


经过更多实验后更新。

我有更多的开发人员来重现它是 &lt;host pageFactoryType="..."&gt;,包括在一个普通的 MVC4 应用程序中(上面的例子,有点明显,来自 * 解决方案;它可能有些笨拙)。

不过,我们找到了解决办法,那就是购买ReSharper 许可证。不是一个很好(或便宜)的解决方法,但仍然是一种解决方法。

安装 ReSharper 后,一切正常,需要注意一点。如果您有自定义的&lt;pages pageBaseType="..."&gt; 注册,则类型必须在同一个项目中,否则您无法获得@this.Model 引用的智能感知(尽管@model 指令有效)。


更多更新。

看起来像一个无操作 HostFactory(扩展 MvcRazorHostFactory 但不覆盖任何方法或包含任何其他代码)工作正常如果您对其进行强命名并将其安装在 GAC 中。我相信我之前测试时使用了错误的 GAC,但是(在一些外部刺激下)能够使用明确的 x64 gacutil 使其工作。

现在的问题是找出我的特定主机工厂出了什么问题;更多细节随着他们被发现。

【问题讨论】:

    标签: c# razor asp.net-mvc-4 visual-studio-2012


    【解决方案1】:

    经过与微软的讨论,我们找到了这个问题的根本原因。

    As usual, it was my code.

    尽管项目(及其周围的一切)是 MVC4,但根本错误是自定义 factoryType 中的 MVC3 引用。

    总而言之,让 Visual Studio IntelliSense 使用自定义 &lt;host factoryType&gt; 在 .cshtml 文件中工作:

    • 你必须为你的程序集强命名
    • 您必须在 GAC 中安装程序集
      • 我们仍然针对本地副本进行调试和部署,但 VS 会在 GAC 中查找
    • 必须拥有所有正确的参考资料*

    请注意,您需要在安装到 GAC 后重新启动 Visual Studio,仅仅重新加载解决方案(通常)是不够的。我们还发现,某些(但不是全部)ReSharper 安装需要清除其缓存,以确保清除缓存。

    添加对驻留在 GAC 中的程序集的引用时的一个小问题是 Visual Studio 默认不会将其复制到您的输出目录,这可能对您有用,但给我们带来了问题。您可以在引用的属性中更改它。

    此外,如果您的自定义工厂抛出任何异常,Visual Studio 给您一些错误消息(“其他错误”紫色下划线我之前无法可靠地重现);除了可能在它的构造函数中(这似乎有点不一致)。

    在我们遇到的情况下,您没有得到任何帮助,类型本身存在严重问题。事情在运行时起作用只是一个巧合(我们正在使用的接口在 MVC3 和 MVC4 之间没有改变,剩下的就是弱命名)。

    *如果您像我们一样安装了 MVC beta 1 到 4,请注意此步骤中的 PEBKAC。

    【讨论】:

      最近更新 更多