COM +中远程实例未知名称的错误调用方法(COM+ invoking method in remo

2019-09-21 14:32发布

我有我是通过互操作使用全球化志愿服务青年在我的.NET项目其中COM DLL。 现在,我得到这个COM组件移动到另一个远程机器和创建实例有一个要求。(种出类似于进程外机,也许这是远程的,我不知道:-))

我所做的是创造了一个新的COM + applciation在服务器机器。 添加此应用中该组件。 这是它是如何在COM +接口的服务器上市。

导出这个应用程序作为代理insatller和安装在我的客户机上。 用下面的代码访问此

Type type;
type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var returnValue = COMObject.GetType().InvokeMember("Method_1",   BindingFlags.Public |  BindingFlags.InvokeMethod, null, COMObject, new object[1] { "1" });

但是,调用Method_1当我收到未知名称(0x80020006)错误? 有之前的任何一个面对类似的问题,请帮助我。

Answer 1:

What I would do is this:

1) create an equivalent interface in C#, something like this:

[Guid("<the interface IID goes here>")]
public interface ISomeInterfaceName
{
   int Method1(...);
   int Method2(...);
   int Method3(...);
   ...
}

2) and then this, instead of your initial late-binding code:

Type type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var if = (ISomeInterfaceName)COMObject;
if.Method1(...);

NOTES: the IID must the IID from the interface, not to be confused with the CLSID. The methods should be laid out to correspond exactly to the COM ones (the methods order is important, how parameters and return type are defined is also important)

You could also import the TLB from the COM component, if you have a lot of classes and intefaces like this.



Answer 2:

你不需要调用方法时使用的GetType()。 COMObject.InvokeMember()应该足够了。

另外,尽量充分利用的ClassID类型-通过使用.GetTypeFromCLSID() -而不是进程id。

此外,而不是BindingFlags.Public使用BindingFlags.Default 。 这将指定所有类型的成员将可用。



Answer 3:

如果您的应用程序代理正确安装和使用在客户端机器配置,你应该能够实例,就像您创建任何其他对象实例的COM +。

尽量只这一点:

IMyExpectedInterface o = new MyCOMServicedComponent();
o.SomeMethod();

如果不细运行让我知道你在实例它异常的结果。



文章来源: COM+ invoking method in remote instance Unknown name error