我有一个使用非托管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没有在本地注册的类没有问题。
答案 0 :(得分:0)
我认为你必须写一个服务组件才能做到这一点。这涉及一些COM +魔法,可能非常复杂。在这里查看摘要:http://msdn.microsoft.com/en-us/library/3x7357ez%28v=vs.71%29.aspx
答案 1 :(得分:0)
创建System.EnterpriseServices.ServicedComponent的子类,然后将其安装在服务器上的COM +中,然后从服务器导出COM +代理(msi),并在客户端上安装此代理。