.NET: Как открыть файл с существующим экземпляром? - PullRequest
4 голосов
/ 08 июня 2011

У меня есть просмотрщик файлов MDI. То есть моя программа может открывать несколько файлов в одном экземпляре. Кстати, мое приложение не является приложением с одним экземпляром, поэтому пользователи могут открывать столько экземпляров, сколько захотят.

Мне нужно поведение

When the user double-clicks a file in Windows Explorer,
if there is an existing instance of my application,
   then open the file with that instance
else
   open the file with a new instance.

Я думаю, что такое поведение очень распространено. Internet Explorer 9 работает как. Итак, я считаю, что, должно быть, было много людей, которые уже реализовали это раньше. Есть ли какой-либо хорошо зарекомендовавший себя пример кода .NET (предпочтительнее C #) для этого (без использования Win32 API, если это возможно)?

Полагаю, что алгоритм может выглядеть примерно так, но я не знаю, является ли он лучшим или самым чистым кодом для его реализации (без использования Win32 API).

At the program's start up
    1)If there are arguments in Main(),
         check for existing instances.
    2)If an instance exists,
         send a message to the instance so that it can open the file.
         Then exit.
    3)else
         open the file.

---- Добавлен ----- Для тех двух человек, которые ответили на мои вопросы с существующими ответами.

МОЕ ПРИЛОЖЕНИЕ НЕ ОДНОЗНАЧНОЕ! Пожалуйста. Это так же, как Internet Explorer 9. Я смотрел на WCF P2P, так как я должен передать сообщение об открытии файла каждому запущенному экземпляру моего приложения, а затем выбрать один из них. Но использование WCF P2P, похоже, очень много для этого работает, потому что кажется, что он открывает и слушает порты TCP. Какова будет лучшая практика?

Ответы [ 2 ]

1 голос
/ 08 июня 2011
1 голос
/ 08 июня 2011

Редактировать: поскольку ваше приложение не является одноэлементным, проверьте ссылку, на которую указал Док Браун ( Открытие «известного типа файла» для запуска экземпляра пользовательского приложения - .NET ), в этой ссылке есть соответствующий ответ Джоэл Мартинес .

Я процитирую его ответ для быстрой ссылки:

<ч />

Как бы я это сделал, это так:

  1. Первым делом в основном методе проверьте список процессов на наличие экземпляр приложения.
  2. Если найдено, отправьте имя файла / путь к уже запущенному экземпляру, используя ваш любимый межпроцесс способ связи ( отправка окон сообщения , удаленное взаимодействие, wcf и т. д.)
  3. Закройте новый процесс, который Windows пыталась запустить (так как существующий экземпляр уже обработал файл, открытый работа
<ч />

Полагаю, вы уже знаете, как проводить IPC, учитывая, что прошли через WCF P2P, но если нет, то я тоже опущу ссылку для этого. Хотя ответ нацелен на одиночный сценарий, он также отлично подойдет и вам. Просто выберите последний экземпляр по дате создания или по любым критериям, подходящим для вашего сценария.

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

Ссылка: System.Diagnostics.Process.GetProcesss

...