代码之家  ›  专栏  ›  技术社区  ›  Alan Mendelevich

Visual Studio:“此文档由另一个项目打开”

  •  11
  • Alan Mendelevich  · 技术社区  · 14 年前

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

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

    根据打开文件的项目类型,这些块中的代码将灰显。因此,如果从Silverlight项目(定义Silverlight的地方)打开文件,else部分是灰色的,Intellisense在其中不起作用。

    “此文档已被其他项目打开” 当您单击OK时,它会在Silverlight项目的上下文中显示该文件(不是我想要看到的)。因此,我必须关闭该文件,再次导航到WPF项目并再次打开该文件。这是非常非常烦人。

    4 回复  |  直到 7 年前
        1
  •  4
  •   Badgerspot    11 年前

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

        2
  •  2
  •   John Bowen    14 年前

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

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

        3
  •  2
  •   Praveen Kumar Thalluri    8 年前

    当我有一个项目包含一个VS解决方案下其他项目的链接文件时,我突然想到了这一点。当我尝试导航到链接文件中方法的定义时,VS提示一条消息 此文档已由另一个项目打开 .

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

        4
  •  1
  •   vulcan raven    11 年前

    是的,这是可以使用visualstudioshell的。

    第一次实例化 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);