让我们说,我正在执行一个用c#编写的exe(只是我选择的语言).它有以下代码:
var comObj=new ComClass();
comObj.DoSomething();
Run Code Online (Sandbox Code Playgroud)
现在,我想知道在哪个进程中DoSomething执行的方法.它是当前exe运行或不同进程响应DoSomething呼叫的进程吗?
这在COM中是完全透明的,你也无法从你的程序中找到.它由存储在注册表中的配置信息确定.COM服务器需要注册的核心原因.不同的场景是:
在创建对象的同一线程上.在服务器注册为进程内服务器且线程的公寓与COM对象的线程模型兼容时使用.最常见的情况,尤其是在程序的UI线程上创建对象时.
在另一个线程上,如果必要的话由COM创建,为对象提供一个线程安全的主页.当您的新语句在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.
有两种主要类型的服务器,进程内和进程外.进程内服务器在动态链接库(DLL)中实现,进程外服务器在可执行文件(EXE)中实现.进程外服务器可以驻留在本地计算机上或远程计算机上.
我认为名字很明确:-)
请注意,即使对于进程外COM服务器,也会有一些代码进程在COM客户端和COM服务器之间进行编组操作.