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

11

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

#if SILVERLIGHT
...
#else
...
#endif
这些代码块的灰色效果取决于您打开文件所在项目的类型。因此,如果您从Silverlight项目(其中定义了SILVERLIGHT)打开文件,则else部分将变灰,并且Intellisense不会在其中工作。
为了使IDE处理WPF部分(带有彩色和Intellisense支持),您需要从WPF项目中打开文件。当您尝试这样做时,会弹出一个消息框,显示“此文档已由另一个项目打开”,当您单击确定后,它会在Silverlight项目的上下文中显示该文件(这不是我想要看到的)。因此,我必须关闭该文件,再次导航到WPF项目并重新打开该文件。这非常、非常让人烦恼。
因此,问题是:是否有某种设置或插件可以使Visual Studio从我双击它的项目中重新打开文件,而不是显示那个愚蠢的消息框并显示我希望看到的"错误"项目中的文件?

4
目前除了关闭文件外,还没有解决此问题的方法。这也是导致在VS2010中出现“无法构建”的dll锁定异常的原因。 - Prince Ashitaka
我想知道插件是否在理论上可以处理这个问题:在用户尝试打开文件之前得到通知,查看同一文件是否已经从另一个项目中打开,关闭该文件,并从当前项目重新打开。如果有这样的API,则听起来是可行的。 - Alan Mendelevich
1
哇,那真的太好了。每次都要关闭和打开文件真的很烦人。 - andrecarlucci
不是完美的解决方案,但是您可以有一个 Silverlight 解决方案和一个 WPF 解决方案,并运行两次 VS。 - Joel Rondeau
4个回答

4

最近一个月,我遇到了两次类似的问题,与WPF应用程序无关。不知道为什么会出现这种情况,但在这两种情况下,解决方法是清理解决方案,重启电脑(不仅仅是重新启动Visual Studio),然后构建解决方案。


2

有一次我在一个VS解决方案下的一个项目包含了其他项目的链接文件。当我尝试导航到链接文件中的一个方法定义时,VS弹出了一个消息提示此文档已被另一个项目打开

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


2
你可以使用部分类和多个文件使其更易于处理:使用共享链接文件来存储WPF和Silverlight都相同的代码,然后使用不同的文件分别存储特定于其中一个项目的代码(具有相同的方法/属性签名),每个文件只在其中一个项目中存在。这样做可以同时打开WPF和Silverlight版本(因为它们是单独的文件),但需要额外的文件管理开销。
除此之外,增加一些内存并使用单独的解决方案也是个好主意。

我在同一个解决方案中的两个项目之间共享文件,但是糟糕的VS经常给我这个“被另一个项目打开”的消息。这个bug已经存在于多个版本的VS中(我正在使用VS2015)。我想知道是否有人向MSFT报告了这个问题,以便他们意识到它。 - Dave C

1

您可以使用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.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接