我有一个使用非托管C++编写的exe文件,其中包含一个COM对象。为了从托管的C#应用程序中访问它,我生成了一个互操作程序集。当两个应用程序在同一台PC上运行时,我能够非常成功地使用它。
现在,我需要让我的C#应用程序在远程PC上访问COM对象,但现有的代码给我带来了一些问题。我不得不进行一些小的更改,例如:
这使我能够更深入地了解代码,但是我遇到了另一个问题。
我使用的是:
我需要在INotifySrc接口上调用AddUser,但新的调用给我返回了错误:
现在,我需要让我的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对于在本地未注册的类没有问题。