两台电脑之间基于COM的软件控制,从Linux到Windows
COM-based software control between two computers, and from Linux to Windows
我不是这个话题的真正专家,所以请原谅在提出问题时可能出现的问题。我们在 Windows 下 运行ning 两个程序,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 在一个上 运行ning,在另一个上 Zemax。如果是,我会把它变得更复杂:Can Matlab 运行ning on a Linux machine control Zemax 运行ning on a Windows machine?
或者 COM 是否严格限制在一台 Windows 机器上?
我对 Mathlab 知之甚少,对 Zemax 也一无所知,但我会给你一般的 COM 解释。
我假设 Zemax 运行 在它自己的进程中,并且 .NET COM 服务器是与这个进程对话的助手。如果 Zemax 是一个带有启用 COM 的 .NET 接口的进程内库,那么您的问题就会成倍增加。
正如 Alex K. 所提到的,COM 本身 支持跨机器使用对象。跨进程、跨机器激活COM对象统称为"DCOM"(Distributed COM)。 DCOM 提供了所有管道,使从任何地方几乎透明地访问 COM 对象成为可能。它甚至可以连接到另一台机器上的 DLL 中实现的对象(在中间主机进程的帮助下保持远程服务器上的 DLL)。然而,事情并没有那么简单。并非每个 COM 对象都可用跨机器。如果服务器对象(Zemax)在设计时没有考虑到这种情况,那么您的要求可能从痛苦到不可能。
您必须查看 Zemax 的文档以了解是否支持此功能。并且您可能必须验证许可证是否允许它(他们可能有一个条款指定每台使用它作为客户端的机器都必须有自己的许可证)。
COM 对象可能无法跨计算机使用的原因有多种,例如:
某些 COM 服务器可能出于与 COM/DCOM 无关的原因而本质上绑定到它们的 COM 客户端。也许该接口旨在传递特定于机器的资源,例如本地文件路径、安全令牌或内核句柄。如果 COM 对象在进程中(完全在 DLL 中实现),根据它的作用,它甚至可能是 process-bound - 或者更糟 - thread-绑定到COM客户端。
COM 服务器可能依赖于自定义 "proxy/stubs"(桥接客户端和 COM 服务器的辅助代码),它依赖于客户端和服务器在同一台机器上(这是这里不太可能是这种情况,因为 COM 助手是一个 .NET 程序集。.NET 不喜欢自定义 proxy/stubs).
接口在设计时可能会考虑本地访问,当网络延迟进入混合时,接口会变得令人难以置信、难以忍受、难以置信的慢。
COM 服务器可能本质上无法容忍客户端断开连接。对于进程内 COM 对象(一个完全在 DLL 中实现的对象),您通常可以假设客户端与服务器同生同死。如果客户端进程意外崩溃,进程间 COM 对象(在与客户端进程分开的进程上实现的对象)应该准备好进行明智的恢复。但是跨网络的 COM 对象 运行ning 基本上必须为网络连接中断做好准备,例如,现在。
最后,你还是要调用它。要么客户端程序必须明确支持跨机器对象激活(不确定 Mathlab 是否支持),要么您将不得不手动调整 Mathlab 机器上 Zemax 的注册表项,使 "remote activation on this specific machine" 成为默认值.
并且您必须首先在 Mathlab 服务器上安装 .NET 库(或更一般地说,COM 类型库),因为 COM 需要了解接口和 类,所以它可以在客户端和服务器机器之间传递数据。最简单的方法可能是在 Mathlab 机器上安装 Zemax,即使您没有 运行 它。
对于问题的最后一部分:我对 Linux 目前对 COM 的支持一无所知。曾几何时(20 年前?)有一些半实验性的第 3 方产品在 UNIX 中启用了有限的 COM 支持,但我认为不再有类似的东西了。无论如何,Linux 的 Mathlab 极不可能支持 COM,所以我不明白这怎么可能。
我不是这个话题的真正专家,所以请原谅在提出问题时可能出现的问题。我们在 Windows 下 运行ning 两个程序,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 在一个上 运行ning,在另一个上 Zemax。如果是,我会把它变得更复杂:Can Matlab 运行ning on a Linux machine control Zemax 运行ning on a Windows machine?
或者 COM 是否严格限制在一台 Windows 机器上?
我对 Mathlab 知之甚少,对 Zemax 也一无所知,但我会给你一般的 COM 解释。
我假设 Zemax 运行 在它自己的进程中,并且 .NET COM 服务器是与这个进程对话的助手。如果 Zemax 是一个带有启用 COM 的 .NET 接口的进程内库,那么您的问题就会成倍增加。
正如 Alex K. 所提到的,COM 本身 支持跨机器使用对象。跨进程、跨机器激活COM对象统称为"DCOM"(Distributed COM)。 DCOM 提供了所有管道,使从任何地方几乎透明地访问 COM 对象成为可能。它甚至可以连接到另一台机器上的 DLL 中实现的对象(在中间主机进程的帮助下保持远程服务器上的 DLL)。然而,事情并没有那么简单。并非每个 COM 对象都可用跨机器。如果服务器对象(Zemax)在设计时没有考虑到这种情况,那么您的要求可能从痛苦到不可能。
您必须查看 Zemax 的文档以了解是否支持此功能。并且您可能必须验证许可证是否允许它(他们可能有一个条款指定每台使用它作为客户端的机器都必须有自己的许可证)。
COM 对象可能无法跨计算机使用的原因有多种,例如:
某些 COM 服务器可能出于与 COM/DCOM 无关的原因而本质上绑定到它们的 COM 客户端。也许该接口旨在传递特定于机器的资源,例如本地文件路径、安全令牌或内核句柄。如果 COM 对象在进程中(完全在 DLL 中实现),根据它的作用,它甚至可能是 process-bound - 或者更糟 - thread-绑定到COM客户端。
COM 服务器可能依赖于自定义 "proxy/stubs"(桥接客户端和 COM 服务器的辅助代码),它依赖于客户端和服务器在同一台机器上(这是这里不太可能是这种情况,因为 COM 助手是一个 .NET 程序集。.NET 不喜欢自定义 proxy/stubs).
接口在设计时可能会考虑本地访问,当网络延迟进入混合时,接口会变得令人难以置信、难以忍受、难以置信的慢。
COM 服务器可能本质上无法容忍客户端断开连接。对于进程内 COM 对象(一个完全在 DLL 中实现的对象),您通常可以假设客户端与服务器同生同死。如果客户端进程意外崩溃,进程间 COM 对象(在与客户端进程分开的进程上实现的对象)应该准备好进行明智的恢复。但是跨网络的 COM 对象 运行ning 基本上必须为网络连接中断做好准备,例如,现在。
最后,你还是要调用它。要么客户端程序必须明确支持跨机器对象激活(不确定 Mathlab 是否支持),要么您将不得不手动调整 Mathlab 机器上 Zemax 的注册表项,使 "remote activation on this specific machine" 成为默认值.
并且您必须首先在 Mathlab 服务器上安装 .NET 库(或更一般地说,COM 类型库),因为 COM 需要了解接口和 类,所以它可以在客户端和服务器机器之间传递数据。最简单的方法可能是在 Mathlab 机器上安装 Zemax,即使您没有 运行 它。
对于问题的最后一部分:我对 Linux 目前对 COM 的支持一无所知。曾几何时(20 年前?)有一些半实验性的第 3 方产品在 UNIX 中启用了有限的 COM 支持,但我认为不再有类似的东西了。无论如何,Linux 的 Mathlab 极不可能支持 COM,所以我不明白这怎么可能。