如何从.NET重新启动远程服务器上的COM +应用程序?

Dan*_*nov 3 .net com comadmin

如何以编程方式从.NET中的代码重新启动远程服务器上运行的COM +应用程序?

Viz*_*izu 7

您必须通过COM互操作使用ComAdmin API.

在Windows\System32\Com\ComAdmin.dll上引用一个引用,然后:

COMAdmin.COMAdminCatalog catalog = new COMAdmin.COMAdminCatalogClass();
catalog.Connect(servername);
catalog.ShutdownApplication(AppNameOrAppID);
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到MSDN中的ComAdmin参考.

这是一个COM API,有点奇怪.例如.您无法实例化COMAdminCatalog,因为它是一个接口,而不是类,因此您必须使用COMAdminCatalogClass来创建新实例.使用Visual Studio的对象浏览器在COMAdmin命名空间中查看以找出这些类型的陷阱.

编辑(注意):

实际上,你可以写

COMAdmin.COMAdminCatalog catalog = new COMAdmin.COMAdminCatalog();
Run Code Online (Sandbox Code Playgroud)

它的工作原理令人惊讶,因为COMAdminCatalog是一个界面.但它必须是VStudio或C#编译器的技巧,因为生成的程序集包含以下IL:

newobj instance void [Interop.COMAdmin]COMAdmin.COMAdminCatalogClass::.ctor()
Run Code Online (Sandbox Code Playgroud)

所以它以某种方式发现COMAdminCatalogClass必须实例化,这很奇怪,也有点混乱.如果有人知道它是如何发生的,请评论.

  • 它与应用于COM Interop接口的CoClass属性有关.早在2009年,我发现了该属性的一些非预期用途,并在http://stackoverflow.com/q/1303717/151249上发布了一个关于它的问题.有关详细信息,请参阅Marc Gravell的答案链接 (2认同)