用C#中更安全的选项替换MarshalByRefObject

本文关键字:选项 替换 MarshalByRefObject 安全 | 更新日期: 2024-09-25 08:58:50

我曾试图在stackoverflow找到一个解决方案,但似乎找不到像我这样的解决方案,所以到此为止。我在实验室里有一台电脑,它连接到各种设备,如云台、相机和光传感器,并安装了所有驱动程序。我在实验室计算机上有C#代码,它知道如何与硬件对话。C#代码可以设置曝光时间,索要图片,取回一张,并将其显示在图片框中。我可以告诉平移/倾斜移动到某个位置,并在完成后让它做出响应。如果我在实验室,一切都按照我想要的方式进行。

问题是,当我真的在另一台电脑上时,我想让它感觉像是在实验室电脑上。最有可能的是,我将从Visual Studio内部运行非实验室计算机上的代码。在实验室中运行的程序将不会从Visual Studio中运行。对于Remoting来说,这是小菜一碟。将与硬件对话的代码放入一个类中,使用MarshalByRefObject和我创建的接口,添加RegisterWellKnowServiceType,然后我可以使用GetObject获取引用并控制它,就像我坐在实验室的计算机旁一样。所以我知道远程处理会起作用。

然而,WCF的远程处理正在逐步淘汰,更不用说它在现实世界中并不真正安全。在我看来,WCF将制作远程对象的本地副本(按值),这意味着它将不在实验室计算机上,因此无法与连接的硬件交互。总有一天,这台实验室计算机和所有传感器设备都将被搬走,我将不得不使用互联网远程访问它。几年前,我确实做了这件事,但我使用的是远程处理。既然远程处理是如此不安全,我如何在不使用远程处理的情况下做到这一点?WCF是否没有与MarshalByRefObject等效的东西?如果WCF只按值使用,那么他们似乎正在逐步淘汰某些东西,而没有提供替换它的功能。有没有一种方法可以使用不安全的远程处理?除了WCF,还有其他东西我应该使用吗?

这可能是长篇大论,但我看到很多人因为提出不太清楚的问题而受到指责,所以我试图澄清。如果已经有一个帖子真正为我的问题提供了最好的答案,我必须首先为自己没有找到它道歉,但要求提供一个链接,这样我就可以在那里得到答案。

用C#中更安全的选项替换MarshalByRefObject

在我看来,WCF将制作的本地副本(按值)远程对象,这意味着它将不在实验室计算机上,并且因此无法与连接的硬件交互

这几乎是完全错误的。没有跨机器进行"复制"。事实上,围绕"远程对象"的整个术语对WCF不再有多大意义。

没有远程对象,只是一个服务。该服务跨边界公开操作。服务消费者可以调用这些操作。当消费者调用某个操作时,该调用会传递到服务中,并可能导致服务的状态发生变化(例如,与某些硬件设备通话)。

该服务还可以向呼叫者发送响应,然后可以使呼叫者状态发生变化(例如,显示硬件设备的输出)。

为了实现这一点,您首先需要创建一个服务定义。然后你需要在实验室机器上托管你的服务。然后,您需要创建一个服务客户端,然后可以在本地机器上使用它来调用服务操作。

(如何)处理端口连接到硬件的情况在实验室计算机上激发需要拾取的DataReceived事件通过我的应用

这是一个更复杂的要求,但是的,WCF支持与客户端的双工通信。

在定义服务契约时,可以指定消费客户端实现回调契约。这迫使客户端定义一个回调操作,该操作通过服务和客户端之间的通信通道公开,然后服务可以调用该操作将信息"推送"给客户端。

您应该让您的服务使用WSDualHttpBinding WCF通道绑定,它将在两个方向上使用端口80,从而允许它在互联网上运行。