2

我有一个 COM dll,我通过互操作引用在我的 .net 项目中使用它。现在我需要将此 COM 组件移动到另一台远程机器并在那里创建实例。(类似于进程外的机器外,可能这是远程处理,我不知道 :-))

我所做的是在服务器机器中创建了一个新的 COM+ 应用程序。在此应用程序中添加了此组件。这就是它在服务器上的 COM+ 接口中的列出方式。 在此处输入图像描述

将此应用程序导出为代理安装程序并安装在我的客户端计算机上。使用以下代码访问此

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 时出现 UNKNOWN NAME (0x80020006) 错误?有没有人遇到过类似的问题,请帮助我。

4

3 回答 3

3

我要做的是:

1) 在 C# 中创建一个等效接口,如下所示:

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

2)然后这个,而不是你最初的后期绑定代码:

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

注意:IID 必须是来自接口的 IID,不要与 CLSID 混淆。方法的布局应与 COM 完全对应(方法顺序很重要,如何定义参数和返回类型也很重要)

如果你有很多这样的类和接口,你也可以从 COM 组件中导入 TLB 。

于 2012-08-30T12:47:27.600 回答
0

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

此外,尝试从 ClassID 获取类型 - 使用.GetTypeFromCLSID()- 而不是 ProgID。

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

于 2012-08-30T10:48:03.413 回答
0

如果您在客户端计算机中正确安装和配置了应用程序代理,您应该能够像创建任何其他对象实例一样实例化您的 COM+。

试试这个:

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

如果运行不正常,请告诉我您在实例化它时得到的异常结果。

于 2012-08-30T11:07:17.467 回答