如何确定.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不像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将使用解析后的命令行填充数组