我有一个COM dll,我通过interop referance在我的.net项目中使用。现在我有一个要求将这个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时我收到了UNKNOWN NAME(0x80020006)错误?有任何一个人面临过类似的问题,请帮助我。
答案 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();
如果运行不正常,请告诉我实例化时得到的异常结果。