0

我们有一个讨厌的(或者可能是微不足道的?)问题。

有一个 WPF 控件。它有 2 个接口,主接口和一个用于自动化测试目的的接口。这样定义:

[ComVisible(true)]
[Guid("xxx")]
public interface IXXXXXTest
{
[DispId(1)]
    void Test1(int index);
}

[ComVisible(true)]
public interface IXXXXX
{
    void Main1(index);
}

[ComVisible(true)]
[Guid("xxx")]
ClassInterface(ClassInterfaceType.None)]
public partial class XXXXX_WPF_CONTROL : UserControl,
                         IXXXXX,
                         IXXXXXTest
{
     ...
}

现在我们正试图从 VBS 到达它。试试 1)

Set Ctrl = GetControl(...)  <---- this is ok
Ctrl.Test1(0)  <---- Object doesn't support this property or method: 'Ctrl.Test1'

Set Ctrl = GetControl(...)  <---- this is ok
Ctrl.Main1(0)  <---- this is ok

所以它适用于“主”界面,但适用于测试界面。这似乎没问题(?),因为据我所知,如果没有 IDispatchEx,VBS 只能通过 IDispatch 到达“主”界面。所以我给IXXXXX加了一个属性来获取测试接口。

[ComVisible(true)]
public interface IXXXXX
{
    void Main1(index);
    IXXXXXTest Test { get;}
}
....
public IXXXXXTest Test
{
    get {   return this as IXXXXXTest;  }
}

太好了,所以现在我可以通过“主”界面访问这个 IXXXXTest 界面。试试 2)

VBS:

Set Ctrl = GetControl(...)  <---- this is ok
Set CtrlTest = Ctrl.Test  <----- this is ok
CtrlTest.Test1(0)    <---- Object doesn't support this property or method: 'CtrlTest.Test1'

:(

请注意,对于我们的其他 .NET 控件,“Try1”可以正常工作,没有任何技巧!

那么可能是由于 WPF 的不同吗?此外,改变

ClassInterface(ClassInterfaceType.None)]

进入其他任何东西(AutoDispatch / AutoDual),或者离开它会使 WPF 控件不可用。

除此之外,这篇文章也应该是这样的:Is it possible to package WPF window as COM Object

你知道可能是什么问题吗?提前非常感谢!

4

1 回答 1

1

脚本语言只能使用类的默认接口。你有不止一个,所以至少其中一个将不可用。如果与其他声明冲突,方法名称可能会被重命名。我假设你在你的问题中混淆了真实姓名,很难从你发布的内容中诊断出这种重命名。

最好的办法是在您的接口类型上临时应用 [InterfaceType(ComInterfaceType.InterfaceIsDual)] 属性。它允许您使用 Tlbexp.exe 生成类型库,然后您可以使用 OleView.exe 实用程序 File + View Typelib 命令查看该库。您将看到方法的确切名称,并且您将看到哪个接口是 coclass 上的 [默认] 接口。从那里你应该可以毫不费力地修改你的声明,这样它们就可以在脚本语言中工作了。

于 2013-01-28T15:00:52.090 回答