COM方法调用在哪里执行

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

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

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

来自COM客户端和服务器

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

我认为名字很明确:-)

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

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

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

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

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

  • 在另一个注册为进程外服务器的进程内部。 规范示例是Microsoft Office程序,如Word和Excel,在.NET编程中很常见。 这是COM开始变脆的地方,意外的程序中止往往会导致服务器继续运行时出现问题。 SO的一个非常常见的问题。

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

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