Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中COM与IPC的互操作#_C#_.net_Com_Ipc_Com Interop - Fatal编程技术网

C# C中COM与IPC的互操作#

C# C中COM与IPC的互操作#,c#,.net,com,ipc,com-interop,C#,.net,Com,Ipc,Com Interop,我有一个关于带COM互操作对象的IPC的问题。我希望在一个进程中创建并填充数据COM互操作对象(例如,用C#编写的Windows服务)。然后我想在另一个进程(C#中的控制台应用程序)中获得它。我知道COM对象不会序列化,它们是非托管代码。我尝试通过.Net远程处理实现解决方案(Windows服务是服务器,控制台应用程序是客户端),但无法在客户端获取COM互操作对象(我在共享库中创建了从MarshalByRef继承的.Net类,使用COM互操作对象创建了公共属性)。有人能告诉我,我能做什么吗?如果

我有一个关于带COM互操作对象的IPC的问题。我希望在一个进程中创建并填充数据COM互操作对象(例如,用C#编写的Windows服务)。然后我想在另一个进程(C#中的控制台应用程序)中获得它。我知道COM对象不会序列化,它们是非托管代码。我尝试通过.Net远程处理实现解决方案(Windows服务是服务器,控制台应用程序是客户端),但无法在客户端获取COM互操作对象(我在共享库中创建了从MarshalByRef继承的.Net类,使用COM互操作对象创建了公共属性)。有人能告诉我,我能做什么吗?

如果双方都是.NET应用程序,就不应该使用COM。这就像买了一辆昂贵的现代汽车,然后用马拉着它

首先,您可以使用远程处理。虽然不再受支持,但它很容易实现,我建议不要使用它。无论如何,远程处理不需要COM互操作。下面是一个使用远程处理的简单“Hello World”:

您还可以使用WCF(windows Communication Foundation)。这一款更先进,更适合现代应用。这是WFC的Hello World:

还有这个:


这两种技术都支持IPC、TCP和HTTP,如果两者都是.NET应用程序,则不应使用COM。这就像买了一辆昂贵的现代汽车,然后用马拉着它

首先,您可以使用远程处理。虽然不再受支持,但它很容易实现,我建议不要使用它。无论如何,远程处理不需要COM互操作。下面是一个使用远程处理的简单“Hello World”:

您还可以使用WCF(windows Communication Foundation)。这一款更先进,更适合现代应用。这是WFC的Hello World:

还有这个:


这两种技术都支持IPC、TCP和HTTP,COM对象本身是不可序列化的,但在编写COM对象时,您应该使用复杂的代理/存根定义-尽管通常是秘密的,但您不必考虑它,特别是如果这些对象是使用某种框架编写的(ATL、delphi、VB6、.NET等)

这些代理/存根将在编译时或运行时使用强大的RPC机制(或多或少是“DCOM”),如果客户机-服务器通信在进程外或跨线程(实际上是COM“单元”)工作

所有这些都意味着,如果您的COM对象是进程内服务器,并且构建正确,COM将提供免费服务,将它们作为“”宿主

通过将COM组件的逻辑组创建为COM+应用程序,您可以 可以利用COM+的以下优点:组件 在上加载到进程(DLLHost.exe)的动态链接库(DLL) 请求和管理(此处与.NET无关)服务器进程来承载组件

如果将对象放在COM+应用程序中,那么您应该能够从.NET代码中使用它,就像它在进程中一样,但现在托管在一个特殊的“代理”系统提供的主机进程(碰巧是著名的dllhost.exe)中。您甚至可以将其配置为完整的Windows服务,如“激活”中所示应用程序配置的选项卡:


COM对象本身是不可序列化的,但在编写COM对象时,应该使用复杂的代理/存根定义-尽管通常是秘密的,但您不必考虑它,特别是如果这些对象是使用某种框架(ATL、delphi、VB6、.NET等)编写的

这些代理/存根将在编译时或运行时使用强大的RPC机制(或多或少是“DCOM”),如果客户机-服务器通信在进程外或跨线程(实际上是COM“单元”)工作

所有这些都意味着,如果您的COM对象是进程内服务器,并且构建正确,COM将提供免费服务,将它们作为“”宿主

通过将COM组件的逻辑组创建为COM+应用程序,您可以 可以利用COM+的以下优点:组件 在上加载到进程(DLLHost.exe)的动态链接库(DLL) 请求和管理(此处与.NET无关)服务器进程来承载组件

如果将对象放在COM+应用程序中,那么您应该能够从.NET代码中使用它,就像它在进程中一样,但现在托管在一个特殊的“代理”系统提供的主机进程(碰巧是著名的dllhost.exe)中。您甚至可以将其配置为完整的Windows服务,如“激活”中所示应用程序配置的选项卡:


NET不完全帮助你编写一个进程外的COM服务器。你应该考虑WCF。我有旧的COM对象,我想使用.NET并不完全帮助你编写一个进程外的COM服务器。你应该考虑WCF。我有遗留的COM对象,我想用它。谢谢你的时间!我会很乐意放弃的。来自COM互操作,但我不能=(我知道WCF,但它使用SOAP协议,COM互操作不可序列化。哦,我明白了。我很抱歉,因为我应该首先问:“你为什么坚持使用COM?”可能有一种方法可以做到这一点。让我试试。谢谢老兄,你的观点很好,我很喜欢:)当然,我的比喻被夸大了,我自己仍然是一个粉丝COM@Alireza,很高兴我们在同一页:)@Zheglov,我想我已经给出了建议、检查和。谢谢你抽出时间!我很乐意放弃COM互操作,但我不能=(我知道WCF,但它使用SOAP协议,COM互操作不可序列化。哦,我明白了。我很抱歉,因为我应该先问:“你为什么坚持使用COM?”也许有一种方法可以做到这一点。让我试试。谢谢你,老兄,你有一个很好的观点,我喜欢它:)当然,我的比喻被夸大了,我自己仍然是一个粉丝COM@Alireza,很高兴我们在同一页:)@Zheglov,我想我已经给出了建议、检查和。西蒙,谢谢你的回复!因此,如果我们选择COM+应用程序作为“服务器应用程序”