让我们说,我正在执行一个用c#编写的exe(只是我选择的语言)。它有以下代码:
var comObj=new ComClass();
comObj.DoSomething();
现在,我想知道在哪个进程中执行了DoSomething
方法。它是当前exe正在运行的进程还是不同的进程响应DoSomething
调用?
答案 0 :(得分:7)
这在COM中是完全透明的,你也无法从你的程序中找到。它由存储在注册表中的配置信息确定。 COM服务器需要注册的核心原因。不同的情况是:
在创建对象的同一线程上。在服务器注册为进程内服务器且线程的公寓与COM对象的线程模型兼容时使用。最常见的情况,尤其是在程序的UI线程上创建对象时。
在另一个线程上,如果需要由COM创建,为该对象提供一个线程安全的主页。当您的 new 语句在MTA(多线程单元)中的线程上运行时,通常会发生这种情况。通常来自工人线程。您创建的对象是代理,其主要工作是序列化传递给方法的参数,并在另一个线程上运行的存根中反序列化它们。它确保对象上的所有调用都是线程安全的。否则与.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。
答案 1 :(得分:5)
有两种主要类型的服务器,进程内和进程外。进程内服务器在动态链接库(DLL)中实现,进程外服务器在可执行文件(EXE)中实现。进程外服务器可以驻留在本地计算机上或远程计算机上。
我认为这些名字非常明确: - )
请注意,即使对于进程外COM服务器,也会有一些代码正在进行COM客户端和COM服务器之间的编组