Visual Studio: "Этот документ открывается другим проектом"

Я большую часть своего времени занимаюсь разработкой элементов управления как для WPF, так и для Silverlight с использованием той же кодовой базы. Для этого я добавляю существующие файлы из одного проекта (например, Silverlight) "как ссылки" на другой (скажем, WPF). Для незначительных различий я использую директивы препроцессора, например

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

Код в этих блоках неактивен в зависимости от типа проекта, из которого вы открыли файл. Поэтому, если вы откроете свой файл из проекта Silverlight (где SILVERLIGHT определен), часть else будет серой, а Intellisense не будет работать в ней.

Чтобы часть WPF обрабатывалась IDE (с поддержкой раскраски и поддержкой Intellisense), вам нужно открыть файл из проекта WPF. Когда вы попытаетесь сделать это, вы получите окно с сообщением, что "Этот документ открывается другим проектом" , и когда вы нажимаете "ОК", он отображает этот файл в контексте проекта Silverlight (не то, что я хотел видеть). Поэтому мне нужно закрыть файл, снова перейти к проекту WPF и снова открыть файл. Это очень, очень раздражает.

Итак, вопрос заключается в следующем: существует ли какая-то настройка или надстройка, которая заставит Visual Studio повторно открыть файл из проекта, где я дважды щелкнул по нему, вместо того, чтобы показывать это глупое окно сообщения и показывая мне этот файл из "неправильный" проект?

Ответ 1

Это случилось со мной примерно два раза в месяц, а не в приложении WPF. Не знаю, почему это происходит, но в обоих случаях исправление заключалось в том, чтобы очистить решение, перезагрузить компьютер (а не просто перезапустить Visual Studio), а затем построить решение.

Ответ 2

Вы можете упростить работу с помощью частичных классов и нескольких файлов: общий код, который одинаковый для WPF и Silverlight в общем связанном файле, и отдельный файл для каждого, содержащий код, специфичный для одного или другой (с идентичными сигнатурами метода/свойства), каждый из которых находится только в одном из проектов. Это позволяет одновременно открывать версии WPF и Silverlight (так как они являются отдельными файлами) за счет добавления дополнительных ресурсов для управления файлами.

Помимо этого, получите дополнительную память и используйте отдельные решения.

Ответ 3

Да, это возможно с помощью 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);

НТН.

Ответ 4

Мне пришло в голову, когда у меня был один проект, содержащий связанный файл другого проекта под одним VS-решением. Когда я попытался перейти к определению метода в связанном файле, VS запросил сообщение с сообщением о том, что этот документ открывается другим проектом.

Чтобы решить эту проблему, мне пришлось выгрузить проект, которому принадлежит исходный файл из решения VS. После этого переход к определению метода в обычное время и время отладки не был проблемой.