如何确定.NET EXE是否由其他进程启动

本文关键字:其他 进程 启动 是否 何确定 NET EXE | 更新日期: 2023-09-27 18:01:12

如果我的标题不准确,请原谅,我已经尽力描述了我的问题。

以下是详细信息,我可以相应地修改:

我一直在将VB6应用程序升级为.NET(VB.NET和C#(应用程序,以便在Excel中使用。使用我的应用程序的ProgID,我可以在Excel VBA中使用查询它

CreateObject("MyExe.MyApp")

由于我相信我的应用程序是一个单实例应用程序,所以当我调用CreateObject并且它已经在运行时,它只会返回正在运行的实例。那里一切都很好。

我的问题是,当它不运行时,它会推出一个新的,对吗?这是我的.NET应用程序中的问题。你看,在VB6中,当你使用CreateObject时,它会将我的App.StartMode更改为VbSModeAutomation = 1

我的VB6应用程序会相应地处理此问题。然而,对于.NET应用程序来说,似乎没有等效的方法来实现这一点。事实上,它在MSDN页面上写着:

StartMode-无等效功能。在Visual Basic 6.0中,使用了此属性以启动作为ActiveX组件的应用程序。ActiveX组件Visual Studio.NET.中不支持创建

因此,最终,我的问题是:如何确定我的.NET应用程序何时从对CreateObject的调用启动,而不是手动启动(或通过standealone,如快捷方式等(?

如何确定.NET EXE是否由其他进程启动

.NET不像VB6那样容易创建进程外COM服务器。支持的方案是COM+托管,您的[ComVisible]类需要从ServicedComponent类派生。

有一篇专门的知识库文章很好地总结了所需的步骤。MSDN的深入文章从这里开始。

检查父进程非常棘手,但您可以在Win32_process WMI类-ParentProcessID属性中找到信息。如果未设置此项,则说明您的应用程序不是由其他应用程序启动的。

您可以使用命令行来确定它的启动方式。CreateObject似乎不允许您传递命令参数,但正如您所指出的,-Embedding似乎会自动被发送。或者,您可以修改快捷方式方法以传递一些伪参数,如果没有它,则可能指示CreateObject启动方法。

NET支持几种获取命令行的方法:

Environment.CommandLine和EnvironmentCommandLineArgs((

我认为VB命名空间中还有另一个,但它返回的是对象集合,而不是字符串或解析参数的字符串数组(空格分隔(。

您也可以修改您的Sub-Man:

 Public Sub Main(args() As String)

NET将使用解析后的命令行填充数组