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. После этого переход к определению метода в обычное время и время отладки не был проблемой.