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 コントロールが使用できなくなります。

それに加えて、これはこの記事の本来あるべき姿でもあります: WPFウィンドウをCOMオブジェクトとしてパッケージ化することは可能ですか?

何が問題なのか分かりますか?よろしくお願いします!

4

1 に答える 1

1

スクリプト言語は、クラスのデフォルト インターフェイスのみを使用できます。複数あるので、そのうちの少なくとも 1 つが使用できなくなります。また、メソッド名が他の宣言と競合する場合は、名前が変更されることがあります。あなたが投稿したものからそのような名前変更が起こっていることを診断するのが難しいので、質問の本名を難読化したと思います。

最善の方法は、インターフェイス タイプに [InterfaceType(ComInterfaceType.InterfaceIsDual)] 属性を一時的に適用することです。これにより、Tlbexp.exe を使用してタイプ ライブラリを生成し、それを OleView.exe ユーティリティの File + View Typelib コマンドで表示できます。メソッドの正確な名前が表示され、どのインターフェイスがコクラスの [デフォルト] であるかがわかります。そこから、スクリプト言語で動作するように宣言を変更するのにほとんど問題はありません。

于 2013-01-28T15:00:52.090 に答える