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

C# 如何确定.NET EXE是否由其他进程启动,c#,vb.net,excel,vba,C#,Vb.net,Excel,Vba,如果我的标题不准确,请原谅,我已尽力描述我的问题 以下是详细信息,我可以相应修改: 我一直在将VB6应用程序升级到.NET(VB.NET和C#)应用程序,以便在Excel中使用。使用我的应用程序的ProgID,我可以使用以下工具在Excel VBA中查询它: CreateObject("MyExe.MyApp") 因为我相信我的应用程序是一个单实例应用程序,所以当我调用CreateObject并且它已经在运行时,它只会返回那个正在运行的实例。那里一切都很好 我的问题是,当它不运行时,它会启动一

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

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

我一直在将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不支持创建


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

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

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

.NET不允许您像VB6使用VbSModeAutomation属性那样轻松创建进程外COM服务器。支持的方案是COM+托管,您的[ComVisible]类需要从ServicedComponent类派生


有一个专门的工具可以很好地总结所需的步骤。深入的MSDN文章。

.NET不允许您像VB6使用VbSModeAutomation属性那样轻松地创建进程外COM服务器。支持的方案是COM+托管,您的[ComVisible]类需要从ServicedComponent类派生


有一个专门的工具可以很好地总结所需的步骤。深入的MSDN文章。

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

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

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

您还可以修改您的Sub-Main:

 Public Sub Main(args() As String)

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

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

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

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

您还可以修改您的Sub-Main:

 Public Sub Main(args() As String)

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

能否传递一个命令行参数以指示开始方法?是否检查了命令行参数?例如,我知道IE是以
-嵌入
的方式启动的。我不确定这是标准的还是可配置的。谢谢你的评论@我还不确定使用
CreateObject
是否有可能实现这一点。对于VB6应用程序,DarkFalcon,是的-它将
-嵌入作为参数发送。但是.NET应用程序没有任何命令行参数不幸的是.NET似乎有命令行参数-事实上有几种方法:
Environment.commandline
Sub-Main
Environment.CommandLineArgs()
。我认为VB名称空间中还有另一个参数,您可以传递一个命令行参数来指示start方法吗?您检查了命令行参数了吗?例如,我知道IE是以
-嵌入
的方式启动的。我不确定这是标准的还是可配置的。谢谢你的评论@我还不确定使用
CreateObject
是否有可能实现这一点。对于VB6应用程序,DarkFalcon,是的-它将
-嵌入作为参数发送。但是.NET应用程序没有任何命令行参数不幸的是.NET似乎有命令行参数-事实上有几种方法:
Environment.commandline
Sub-Main
Environment.CommandLineArgs()
。我认为VB名称空间中还有另外一个名称空间。。。如果它不是由另一个过程开始的,它是如何开始的?(听起来很有哲理,但除非你是系统[4],否则你必须有一个家长……如果ppid为null,这意味着你是孤儿,而不是说你没有家长)@Paulch先生,我想我可以检查
IFF
父进程是Excel,然后像
App.StartMode=1
那样处理它。虽然这不是答案所暗示的。我就如何检查PPID@MrPaulch I s给出了完整的答案