通过C#访问远程COM对象

4
我有一个使用非托管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接口上调用AddUser,但新的调用给我返回了错误:
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)).

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

我的问题是:不可能在远程计算机上使用注册吗?Activator.CreateInstance对于在本地未注册的类没有问题。

2个回答

0

谢谢。我会进一步研究这个问题。 - AntonyW

0
创建一个 System.EnterpriseServices.ServicedComponent 的子类,然后在服务器上安装它到 COM+,接着从服务器导出一个 COM+ 代理(msi),并将此代理安装到客户端。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接