基于com的软件控制两台计算机之间,并从Linux到Windows



我不是这方面的专家,所以请原谅我在提出问题时可能出现的小问题。我们在Windows下运行两个程序,Zemax和Matlab,其中Matlab通过。net接口控制Zemax。(它是Zemax这个事实对这个问题来说并不重要,只是为了具体一点。)Matlab代码如下所示:

import System.Reflection.*;
NET.addAssembly('C:Program FilesZemax OpticStudio 16ZOS-APILibrariesZOSAPI_NetHelper.dll');
NET.addAssembly(AssemblyName('ZOSAPI_Interfaces'));
NET.addAssembly(AssemblyName('ZOSAPI'));
TheConnection = ZOSAPI.ZOSAPI_Connection();
app = TheConnection.CreateNewApplication();
...

如果Matlab和Zemax都安装在同一台Windows机器上,这就可以了。我想知道:是否有可能在两台机器之间运行这样的控制 ?Matlab在一个上运行,Zemax在另一个上运行。如果是的话,我让它更复杂:在Linux机器上运行的Matlab可以控制在Windows机器上运行的Zemax吗?

还是COM严格限制在一台Windows机器上?

我对Mathlab知之甚少,对Zemax一无所知,但我将给你一个通用的COM解释。

我将假设Zemax运行在它自己的进程中,并且。net COM服务器是与这个进程对话的助手。如果Zemax是一个进程内库,具有启用com的。net接口,那么您的问题将成倍增加。

正如Alex K.提到的,COM 本身支持跨机器使用对象。跨进程和跨机器的COM对象的激活统称为"DCOM"(分布式COM)。DCOM提供了所有的管道,使从任何地方几乎透明地访问COM对象成为可能。它甚至可以连接到另一台机器上DLL中实现的对象(借助中间主机进程来保持远程服务器上的DLL)。然而,事情并没有那么简单。不是每个COM对象都可以跨机器使用。如果服务器对象(Zemax)在设计时没有考虑到这种情况,那么您的请求可能会让人感到痛苦,甚至无法实现。

您必须检查Zemax的文档以查看是否支持此操作。您可能必须验证许可证是否允许这样做(他们可能有一个子句,指定使用它作为客户端的每台机器都必须拥有自己的许可证)。

COM对象可能跨机器不可用的原因有几个,例如:

  • 由于COM/dcom以外的原因,一些COM服务器可能本质上是机器绑定到它们的COM客户端的。也许接口被设计为传递特定于机器的资源,如本地文件路径、安全令牌或内核句柄。如果COM对象是进程内的(完全在DLL中实现),根据它的作用,它甚至可能被进程绑定,或者更糟的是,线程绑定到COM客户端。

  • COM服务器可能依赖于客户端和服务器在同一台机器上的自定义"代理/存根"(连接客户端和COM服务器的辅助代码)(这里不太可能是这种情况,因为COM辅助程序是。net程序集。net不喜欢自定义代理/存根)。

  • 接口可能在设计时考虑到本地访问,当网络延迟进入混合时,接口会变得令人难以置信,令人难以忍受,难以想象的慢。

  • COM服务器可能本质上不容忍客户端断开连接。对于进程内COM对象(完全在DLL中实现的对象),您通常可以假设客户端与服务器一起生存和死亡。如果客户端进程意外崩溃,进程间COM对象(在与客户端进程分离的进程上实现的对象)应该准备好合理地恢复。但是在网络上运行的COM对象必须为网络连接死亡做好准备,例如,现在

最后,您仍然需要调用它。要么客户机程序必须显式地支持跨机器对象激活(不确定Mathlab是否支持),要么您必须在Mathlab机器上手动调整Zemax的注册表项,使"在这台特定的机器上远程激活"成为默认值。

您必须首先在Mathlab服务器上准备好. net库(或者更一般地说,COM类型库),因为COM需要了解接口和类,因此它可以在客户机和服务器机器之间传递数据。最简单的方法可能是在Mathlab机器上安装Zemax,即使您不在那里运行它。

对于问题的最后一部分:我对Linux中当前对COM的支持一无所知。曾几何时(20年前?)有一些半实验性的第三方产品在UNIX中支持有限的COM,但我认为现在已经不存在这样的产品了。无论如何,Mathlab for Linux极不可能支持COM,所以我不认为这是可能的。

相关内容

最新更新