通过C#访问远程COM对象

时间:2011-02-21 17:30:40

标签: c# com com-interop

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

现在,我要求让我的C#app访问远程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,但 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没有在本地注册的类没有问题。

2 个答案:

答案 0 :(得分:0)

我认为你必须写一个服务组件才能做到这一点。这涉及一些COM +魔法,可能非常复杂。在这里查看摘要:http://msdn.microsoft.com/en-us/library/3x7357ez%28v=vs.71%29.aspx

答案 1 :(得分:0)

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