我不是这个主题的专家,所以请原谅我在制定问题时可能出现的问题。我们在Windows,Zemax和Matlab下运行两个程序,Matlab通过.NET COM接口控制Zemax。 (事实上它的Zemax对于这个问题并不重要,它只是具体而言。)Matlab代码如下所示:
import System.Reflection.*;
NET.addAssembly('C:\Program Files\Zemax OpticStudio 16\ZOS-API\Libraries\ZOSAPI_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机器?
答案 0 :(得分:3)
我对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中实现),根据它的作用,它甚至可能是进程 -bound - 或更糟 - 线程 -bound到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,所以我不知道这是怎么回事。