执行的COM方法调用在哪里



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

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

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

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

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

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

  • 在进程内组件的代理过程内部。不太常见,但代理可以非常方便地解决流程比特问题。允许您在64位进程中使用32位服务器。需要32位和64位代理/存根。

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

  • 在另一台机器上的另一个进程内部。称为DCOM或分布式COM。需要额外的配置步骤来确保可以选择目标计算机和正确的帐户权限。它因给人类带来头痛而臭名昭著,但现在已经不怎么使用了。DCOM最出名的是让Java在90年代末的中端战争中吃到了微软的午餐。

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

来自COM客户端和服务器

服务器主要有两种类型,进程内服务器和进程外服务器。进程内服务器在动态链接库(DLL)中实现,进程外服务器在可执行文件(EXE)中实现。进程外服务器可以位于本地计算机上,也可以位于远程计算机上。

我确实认为这些名字很明确:-)

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

最新更新