我想打个电话
[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关联的明显文章。
发布于 2016-02-17 06:32:41
我无法解释为什么会出现这个问题,但解决办法很容易。我为我试图传递给COM的接口创建了一个代理类。
public class PropertyManagerPage2Handler9Wrapper : IPropertyManagerPage2Handler9
{
readonly IPropertyManagerPage2Handler9 _Implementation;
public PropertyManagerPage2Handler9Wrapper(IPropertyManagerPage2Handler9 implementation)
{
_Implementation = implementation;
}
public void AfterActivation()
{
_Implementation.AfterActivation();
}
public void OnClose(int Reason)
{
_Implementation.OnClose(Reason);
}
public void AfterClose()
{
_Implementation.AfterClose();
}
<snip>
}并将包装器传递给COM函数,而不是原始实例。然后就没有类强制转换异常。
var propertyManagerPage = SwApp.CreatePropertyManagerPage
(_Name, options, new PropertyManagerPage2Handler9Wrapper(this), ref errors);而不是这个
var propertyManagerPage = SwApp.CreatePropertyManagerPage
(_Name, options, this, ref errors);https://stackoverflow.com/questions/35438895
复制相似问题