如何确定.NET EXE是否由另一个进程启动

时间:2014-04-30 13:53:58

标签: c# vb.net excel-vba vba excel

请原谅我,如果我的头衔不准确,我会尽力描述我的问题。

这是细节,我可以相应地修改:

我一直在将VB6应用程序升级到.NET(VB.NET和C#)应用程序以在Excel中使用。使用我的应用程序的ProgID,我可以使用以下方法在Excel VBA中查询:

CreateObject("MyExe.MyApp")

因为我认为我的应用程序是单实例应用程序,所以当我调用CreateObject并且它已经在运行时,它只会返回我正在运行的实例。一切都很好。

我的问题是,当它没有运行时,它会启动一个新的权利吗?这是我的.NET应用程序中的问题。您在VB6中看到,当您使用CreateObject时,它会将我的App.StartMode更改为VbSModeAutomation = 1

我的VB6应用程序相应地处理这个问题。但是,对于.NET应用程序,似乎没有相同的方法。事实上,它正好在this MSDN页面上说:

  

StartMode - 没有等价物。在Visual Basic 6.0中,使用了此属性   将应用程序作为ActiveX组件启动。 ActiveX组件   Visual Studio .NET不支持创建。

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

3 个答案:

答案 0 :(得分:4)

.NET并不像创建进程外COM服务器那样容易,就像VB6使用该VbSModeAutomation属性一样。支持的场景是COM +托管,您的[ComVisible]类需要从ServicedComponent类派生。

有专门的KB article,可以很好地总结所需的步骤。深入的MSDN文章start here

答案 1 :(得分:1)

检查父进程非常棘手但您可以在Win32_Process WMI类 - ParentProcessID属性中找到相关信息。如果未设置,则应用程序不会被其他应用程序启动。

答案 2 :(得分:1)

您可以使用CommandLine来确定它的启动方式。 CreateObject似乎不允许您传递命令参数,但正如您所指出的,-Embedding似乎会自动发送。或者,也许您可​​以修改快捷方法以传递一些假参数,但它的缺失可能表示CreateObject启动方法。

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

Environment.CommandLineEnvironment.CommandLineArgs()

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

您也可以修改您的Sub Main:

 Public Sub Main(args() As String)

NET将使用解析的命令行

填充数组