远程实例中的COM +调用方法未知名称错误

时间:2012-08-24 10:35:18

标签: c# .net com remoting

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

我所做的是在服务器机器中创建了一个新的COM + applciation。在此应用程序中添加了此组件。这是它在服务器上的COM +接口中列出的方式。 enter image description here

将此应用程序导出为代理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时我收到了UNKNOWN NAME(0x80020006)错误?有任何一个人面临过类似的问题,请帮助我。

3 个答案:

答案 0 :(得分: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组件import the TLB

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

试试这个:

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

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