【发布时间】:2016-05-28 02:32:52
【问题描述】:
我想进行 COM 调用
[DispId(163)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime)]
[return: MarshalAs(UnmanagedType.IDispatch)]
object CreatePropertyManagerPage
([MarshalAs(UnmanagedType.BStr), In] string Title,
[In] int Options,
[MarshalAs(UnmanagedType.IDispatch), In] object Handler,
[In, Out] ref int Errors);
Handler 属性是导致我出现问题的原因。如果我传入一个继承自
的对象public abstract class PmpBase<TMacroFeature,TData> : IPropertyManagerPage2Handler9
然后我得到一个 InvalidCastException。但是,如果我删除泛型并传递一个继承自
的类public abstract class PmpBase : IPropertyManagerPage2Handler9
通过硬编码文件中的类型,然后对象传递到调用中。我可以通过这样做来复制相同的发现
new DispatchWrapper(foo)
其中 foo 是派生自泛型(失败)和非泛型(通过)版本的类的实例。
我对 COM 的了解为零,只是尝试使用 Solidworks 的自动化接口。我是否正在尝试做一些不可能的事情。我没有发现任何将泛型与 COM 错误相关联的明显文章。
【问题讨论】:
-
很不清楚你是如何从一个抽象类声明变成一个作为 Handler 参数传递的具体对象。 COM 不支持泛型。
-
我说我传入的实例来自一个继承自抽象类的具体类。当您说 COM 不支持泛型时,您的意思是任何从具体类型继承的类都不受支持,或者将 com 接口声明为泛型是不受支持的。
-
handler 参数实际上是在寻找实现的接口 IPropertyManagerPage2Handler9。我可能只是制作一个不涉及通用并且可能解决问题的包装代理。明天试试。
-
代理技术有效。我将其添加为答案。我仍然不明白为什么它会有所作为。
标签: c# .net exception com marshalling