gpt4 book ai didi

c# - 通过 C# 访问远程 COM 对象

转载 作者:行者123 更新时间:2023-11-30 13:05:25 27 4
gpt4 key购买 nike

我有一个使用非托管 C++ 编写的 exe 文件,其中包含一个 COM 对象。为了从托管 C# 应用程序访问它,我生成了一个互操作程序集。当两个应用程序在同一台 PC 上运行时,我能够成功地使用它。

现在,我需要让我的 C# 应用程序访问远程 PC 上的 COM 对象,而现有代码给我带来了一些问题。我不得不做一些小的改变,例如

Type ReportItemSetup = Type.GetTypeFromProgID("ACME.REPORTITEMSETUP.1", remotePCName);
RpiSetup = (IReportItemSetup)Activator.CreateInstance(ReportItemSetup);

成为

Guid gris = new Guid("{147FF3D1-8A00-11F0-9A6C-0000C099D00B}");
Type ReportItemSetup = Type.GetTypeFromCLSID(gris, remotePCName, true);
RpiSetup = (IReportItemSetup)Activator.CreateInstance(ReportItemSetup);

这使我能够更深入地了解代码,但随后我遇到了另一个问题。

我用:

REPORTITEMSETUPClass rpis = new REPORTITEMSETUPClass();

REPORTITEMSETUPClass 在哪里(为简洁起见进行了编辑)

namespace Acme.ReportItemServers.Interop
{
[ClassInterface(ClassInterfaceType.None)]
[TypeLibType(TypeLibTypeFlags.FAppObject | TypeLibTypeFlags.FCanCreate | TypeLibTypeFlags.FPreDeclId)]
[ComConversionLoss]
[Guid("147FF3D1-8A00-11F0-9A6C-0000C099D00B")]
public class REPORTITEMSETUPClass : IReportItemSetup, REPORTITEMSETUP, INotifySrc
{
public REPORTITEMSETUPClass();

... snip ...
public virtual void INotifySrc_AddUser(INotify pNotify, string bstrUserName);
... snip ...
}
}

我需要在 INotifySrc 接口(interface)上调用 AddUser 但 new 调用给我错误:

Retrieving the COM class factory for component with CLSID {147FF3D1-8A00-11F0-9A6C-0000C099D00B} failed due to the following error: 
80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

这个错误是完全正确的,因为它没有在本地机器上注册。

因此我的问题是:是否无法在远程 PC 上使用注册? Activator.CreateInstance 没有在本地注册类的问题。

最佳答案

我认为您必须编写一个服务组件来执行此操作。这涉及一些 COM+ 魔法,并且可能非常复杂。在这里查看摘要:http://msdn.microsoft.com/en-us/library/3x7357ez%28v=vs.71%29.aspx

关于c# - 通过 C# 访问远程 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069189/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com