.NET:如何使用现有实例打开文件?

4
我是一个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

编辑:由于您的应用程序不是单例模式,请查看Doc Brown指出的链接(打开“已知文件类型”到自定义应用程序的运行实例 - .NET),该链接中有一个相关的答案,由Joel Martinez提供。

我会引用的回复以便快速参考:


我会这样做:
  1. 在主方法中,首先检查进程列表是否存在应用程序的现有实例。
  2. 如果找到了,使用您喜欢的进程间通信方法(发送Windows消息、远程调用、WCF等)将文件名/路径发送到已运行的实例。
  3. 关闭Windows尝试启动的新进程(因为现有实例已经处理了文件打开操作)。

我猜您已经知道如何进行进程间通信,考虑到您已经经历了 WCF P2P,但如果还不会,我也会为您提供一个链接。尽管答案针对单例场景,但对您也完全适用。只需按创建日期或任何适合您场景的标准选择最后一个实例即可。

请注意,使用此方法无法获取最后一个活动实例,除非您自己以某种方式跟踪该信息并从新实例中轮询该信息。

参考资料:System.Diagnostics.Process.GetProcesss


抱歉,我的应用程序不是单例应用程序。我必须找到最近使用的实例并使用它打开文件。 - Damn Vegetables
哦!抱歉,我会编辑答案。我漏掉了那一部分。我的借口是:这是在连续编码10个小时后离开办公室之前。 :) - Maverik

1

1
抱歉,我的应用程序不是单例应用程序。我必须找到最近使用的实例并使用它打开文件。 - Damn Vegetables

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