有没有办法在正在运行的.NET程序集中调用方法。
问题是我有一个在系统启动时运行的.NET应用程序,并将自身置于系统托盘中。用户可以通过双击托盘图标打开应用程序对话框,但即使用户再次启动应用程序(并且已经运行),我也想显示该表单。 目前在main方法中,我将正在运行的.NET程序集作为Process,但不知道如何获取对内部类/方法的引用。
我能够了解一个实例是否已经在运行但是想知道如何从我拥有的进程句柄中调用方法。 当它是第二个实例时,我检查所有正在运行的进程并获得指向我已经运行的进程的指针。我想知道是否有一种方法在.NET(彻底反射或其他东西)中使用这个进程句柄并返回一个指向接口的指针。
- 已于2009年4月7日加入 - 有许多解决方案可以找到一个实例是否已经在运行,但我真正想要的是将流程转换为某个接口并在其上调用方法。 或者使用一些参数将消息传递给正在运行的应用程序。
答案 0 :(得分:5)
这不是问题的解决方案(调用特定方法),但它可以解决您打开表单的问题。
解决方案过于复杂,无法在此处复制,请查看以下内容: http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx
这段代码有什么作用?
- 当用户尝试第二次打开应用程序时,第二次 实例未在屏幕上打开。
- 而是第一个实例来到前台。如果它被最小化, 它已经恢复。
- 如果应用程序最小化到系统托盘,那么它是 从那里恢复。
醇>
如果你需要在实例之间传递参数,你甚至可以跳到页面的末尾(我真的很喜欢VB解决方案......很遗憾它不是为任何语言设计的。但是你仍然可以使用它通过在C#app中引用VisualBasic命名空间。)
希望这有帮助。
答案 1 :(得分:1)
并非没有使用某种进程间通信机制。在.Net中实现这种IPC机制的一种相对直接的方法是使用WCF并在WCF端点中公开您需要的接口。
您可以使用其他IPC机制,包括命名管道,套接字等,但在这些情况下,您必须担心数据协议和序列化。 WCF的优势就在于您。
答案 2 :(得分:0)
IMO,对你来说更好的是使用可以设置标志的Mutex将应用程序限制为单个实例,并且在应用程序启动时,您可以重新检查该标志以查看应用程序是否已在运行
答案 3 :(得分:0)
这样做的最佳解决方案是声明全局Mutex
try
{
System.Threading.Mutex.OpenExisting("mymutex");
//MessageBox.Show("already exist instance");
//TODO
}
catch
{
m = new System.Threading.Mutex(true, "mymutex");
}