【问题标题】:Visual Studio: "This document is opened by another project"Visual Studio:“此文档已被另一个项目打开”
【发布时间】:2011-04-30 04:04:52
【问题描述】:

我大部分时间都在使用相同的代码库为 WPF 和 Silverlight 开发控件。为此,我将一个项目(比如 Silverlight)中的现有文件“作为链接”添加到另一个项目(比如 WPF)。对于细微的差异,我使用预处理器指令,如

#if SILVERLIGHT
...
#else
...
#endif

根据您打开文件的项目类型,这些块中的代码会显示为灰色。因此,如果您从 Silverlight 项目(其中定义了 SILVERLIGHT)打开文件,else 部分是灰色的,并且 Intellisense 无法在其中工作。

为了让 IDE 处理 WPF 部分(具有着色和 Intellisense 支持),您需要从 WPF 项目中打开文件。当您尝试这样做时,您会收到一个消息框,提示 “此文档已由另一个项目打开”,当您单击“确定”时,它会在 Silverlight 项目的上下文中显示该文件(不是我想要的查看)。所以我必须关闭文件,再次导航到 WPF 项目并再次打开文件。这非常非常烦人。

所以问题是这样的:是否有某种设置或附加组件可以使 Visual Studio 从我双击它的项目中重新打开文件,而不是显示那个愚蠢的消息框并向我显示该文件“错误”的项目?

【问题讨论】:

  • 目前除了关闭文件外,没有解决这个问题的办法。此外,这也是 VS2010 中 dll 锁定“无法构建...”异常的原因。
  • 我想知道加载项在理论上是否可以处理这个问题:在用户尝试打开文件之前得到通知,查看是否已经从另一个项目打开了同一个文件,关闭该文件,然后重新打开从当前项目。如果有这样的 API,听起来是可行的。
  • 伙计,那真是太好了。不得不一直关闭和打开文件很烦人。
  • 不是一个完美的解决方案,但您可以拥有 1 个 silverlight 解决方案和 1 个 WPF 解决方案并运行 VS 两次。

标签: wpf visual-studio silverlight


【解决方案1】:

这在我一个月内发生了两次,而不是在 WPF 应用程序中。不知道为什么会这样,但在这两种情况下,修复都是清理解决方案,重新启动 PC(不仅仅是重新启动 Visual Studio),然后构建解决方案。

【讨论】:

    【解决方案2】:

    您可以通过使用部分类和多个文件使这更容易处理:共享链接文件中的 WPF 和 Silverlight 的共享代码是相同的,并且每个文件包含一个单独的文件,其中包含特定于一个的代码或另一个(具有相同的方法/属性签名),每个都只在一个项目中。这样做可以同时打开 WPF 和 Silverlight 版本(因为它们是单独的文件),但代价是增加了一堆额外的文件管理开销。

    除此之外,获得一些额外的内存并使用单独的解决方案。

    【讨论】:

    • 我在同一个解决方案中的两个项目之间共享文件——而糟糕的 VS 经常给我这个“由另一个项目打开”的消息。多个版本的 VS 都存在这个错误(我使用的是 VS2015)。我想知道是否有人向 MSFT 报告了此事,以便他们知道。
    【解决方案3】:

    我突然想到,当我在一个 VS 解决方案下有一个项目包含另一个项目的链接文件时。当我试图导航到链接文件中的方法定义时,VS 提示 此文档已被另一个项目打开 的消息。

    要解决此问题,我必须从 VS 解决方案中卸载拥有原始文件的项目。之后,在正常时间和调试时间导航到方法定义就不是问题了。

    【讨论】:

      【解决方案4】:

      是的,这可以使用 Visual Studio Shell。

      首先实例化EnvDTE80.DTE2对象:

      private static EnvDTE80.DTE2 _dte;
      
      public static EnvDTE80.DTE2 DTE
      {
          get
          {
              if (_dte == null)
                  _dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE2;
      
              return _dte;
          }
      }
      

      然后:

      // On Document Opening, close the existing instances.
      // This event occurs when you double-click file in Solution Explorer.
      
      DTE.Events.DocumentEvents.DocumentOpening += (s, e) =>
      {
          if(!DTE.ItemOperations.IsFileOpen(YOURFILENAME))
              return;
      
          foreach(Window win in DTE.Documents.Cast<Document>()
                               .FirstOrDefault(s => s.FullName == YOURFILENAME).Windows))
              win.Close();
      }
      
      // next; VS itself will call DTE.ItemOperatins.OpenFile(YOURFILENAME);
      

      HTH。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-06
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多