COM 方法调用在哪里执行

Where are COM method calls executed

比方说,我正在执行一个用 c# 编写的 exe(只是我选择的语言)。它有以下代码:

var comObj=new ComClass();
comObj.DoSomething();

现在,我想知道DoSomething方法是在哪个进程中执行的。当前exe是运行的同一个进程还是不同的进程响应DoSomething调用?

来自COM Clients and Servers

There are two main types of servers, in-process and out-of-process. In-process servers are implemented in a dynamic linked library (DLL), and out-of-process servers are implemented in an executable file (EXE). Out-of-process servers can reside either on the local computer or on a remote computer.

我确实认为这些名称非常明确:-)

请注意,即使对于进程外的 COM 服务器,也会有一些进程内代码执行 COM 客户端和 COM 服务器之间的封送处理

这在COM中是完全透明的,你也无法从你的程序中发现。它由存储在注册表中的配置信息确定。 COM服务器需要注册的核心原因。不同的场景是:

  • 在创建对象的同一线程上。当服务器注册为进程内服务器并且线程单元与 COM 对象的线程模型兼容时使用。最常见的情况,尤其是当您在程序的 UI 线程上创建对象时。

  • 在另一个线程上,如果需要由 COM 创建,为对象提供一个线程安全的家。当您的 new 语句在 MTA(多线程单元)中的线程上运行时,通常会发生这种情况。通常来自工作线程。您创建的对象是一个 proxy,它的主要工作是序列化您传递给方法的参数并在运行于的 stub 中反序列化它们另一个线程。它确保对该对象的所有调用都是线程安全的。否则与 .NET Remoting 中使用的机制相同。负责封送处理的底层是 LRPC,一个不起眼的 Windows 组件,经过优化以尽可能快地进行线程间和进程间调用。

  • 在进程内组件的 代理项 进程中。不是很常见,但代理可以非常方便地解决例如进程位数问题。允许您在 64 位进程中使用 32 位服务器。需要 32 位和 64 位 proxy/stubs.

  • 在注册为进程外服务器的另一个进程中。典型的例子是 Microsoft Office 程序,如 Word 和 Excel,在 .NET 编程中非常常见。这是 COM 开始变得脆弱的地方,意外的程序中止往往会在服务器保持 运行 时造成混乱。 SO 的一个非常 常见问题。

  • 在另一台机器上的另一个进程中。称为 DCOM 或分布式 COM。需要一个额外的配置步骤来确保可以选择目标机器和适当的帐户权限。因让人头疼欲裂而臭名昭著,现在已经很少使用了。 DCOM 最大的声望是让 Java 在 90 年代后期的中间件大战中吃掉了微软的午餐。

如果您不知道这些场景中的哪一个适用于您的情况,那么像 SysInternals 的 Process Monitor 这样的实用程序往往会提供洞察力。您会看到您的程序正在读取注册表,告诉您在哪里查看,然后加载 DLL 或启动 EXE。