请原谅我,如果我的头衔不准确,我会尽力描述我的问题。
这是细节,我可以相应地修改:
我一直在将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,如快捷方式等)?
答案 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.CommandLine和Environment.CommandLineArgs()
我认为VB命名空间中还有另一个,但它返回一个对象集合,而不是String或String数组的解析args(空格分隔)。
您也可以修改您的Sub Main:
Public Sub Main(args() As String)
NET将使用解析的命令行
填充数组