1

我有一个 .NET C# WPF 应用程序,我正在尝试使用 Mutex 将其制成单实例应用程序。

此 .NET 应用程序由基于 C++ 的 DLL 使用 CreateProcessAsUser() 调用,并通过环境变量获得参数。

后续实例也将由 C++ DLL 以相同方式创建。

随后的实例需要在退出之前将它们的参数传递给应用程序的第一个实例。

问题是在 .NET 应用程序中可以使用哪些方法,以便后续实例能够将它们的数据传递给 .NET 应用程序的第一个实例?越简单越好。

我研究了一些,但我希望有更简单的方法。

我研究过的东西:

  • 命名管道
  • .NET 远程处理
  • Windows 消息(将 WM_COPYDATA 发送到第一个实例窗口)

由于我只是想将 4 个字符串传递给第一个实例,因此我试图避免使用上述方法,因为它们对我的问题来说有点矫枉过正。

我能想到的最简单的方法是从 .NET 应用程序中导出一个函数,这样 .NET 应用程序的后续实例就可以在 .NET 应用程序的第一个实例上调用此函数并将数据作为函数的参数传递. 但是,这在 .NET 中可行吗?我读过 .NET EXE 或 DLL 无法导出函数。

谢谢!

4

3 回答 3

1

我能想到的最简单的方法是从 .NET 应用程序中导出一个函数,然后后续实例可以调用该函数并将参数传递给它。

这不是它的工作原理。您将在调用进程中加载​​ .NET 程序集,而不是神奇地越过进程边界并与子进程对话。

只需让父母使用 Process 类打开带有重定向管道的孩子,并让孩子使用 Console.Read* 从标准输入读取

于 2008-11-21T07:19:46.047 回答
0

谢谢你的回复,保罗!

不过,我在上面的问题中添加了更多细节,因为我不确定我的场景是否被正确理解。

但是关于您的回答,.NET 应用程序的父级将是一个基于 C++ 的 DLL,它所要做的就是调用 .NET 应用程序并为其提供参数。基于 C++ 的 DLL 也将在此之后退出,所以我不想再向它添加任何行为。

因此,数据的传递将仅在 .NET 应用程序的实例之间完成。

于 2008-11-21T08:12:50.653 回答
0

由于您要从 .NET 转到 .NET,我建议您只进行 WCF 调用。您可以在两个 .NET 实例之间使用命名管道传输来公开“服务”(这是您的第一个实例将公开的内容)。

后续实例将执行单实例检查,如果它们检测到已经运行的实例,它们可以对第一个实例中运行的服务进行 WCF 调用并以这种方式传递数据。

于 2008-11-22T04:20:16.193 回答