2

VB6 ActiveX exe プロジェクトでは、新しいイベントが追加された場合に、イベント ディスパッチ インターフェイスの GUID を保持する方法はありますか?

既存のイベントを変更すると、明らかに互換性が失われます。新しいものを追加しても、VB6 IDE は警告を発しません。ただし、新しいメソッドを追加しても警告は表示されませんが、少なくとも既存のメソッドは GUID を保持するため、これは特に驚くことではありません。

イベントでは、新しいイベントが後で追加された場合、既存のイベントの下位互換性を維持する方法がないようです。

これは、COM 経由で統合する VB6 アプリケーションの問題ではないようです。VB ランタイムは、GUID を前もって知る必要なく、レジストリを介してイベントを取得するために何か賢いことをしていると思います。

他のアプリが .Net (具体的には C#) であり、イベント シンクを実装するために手動でインターフェイスを宣言する必要がある場合、VB6アプリが拡張されました。VB6 アプリで新しく実装されたイベントについては、私は知らないかもしれませんし、気にすることもありません。.Net ソース コードを変更する必要なく、既存のイベントを引き続き使用できるようにしたいだけです。

これを可能にするために見逃しているVB6のトリックはありますか?

4

3 に答える 3

2

問題は、一度定義された COM インターフェイスが不変であることです。ただし、COM にはバージョン管理があり、古いインターフェイスを新しいインターフェイスと互換性があるものとしてセットアップできます。

Visual BASIC が舞台裏で行っていることは、新しいバージョンの com インターフェイスを作成することです。バージョン番号を更新し、新しいメソッドを追加し、必要な情報を設定して、新しいインターフェイスを古いインターフェイスで自動的に使用できるようにします。

指摘したように、イベントは自動的に行われないようです。Visual Studio OLE/COM オブジェクト ビューを使用して、GUID の変更を確認しました。

ハイブリッド VB6/.NET の考えられる解決策は少し面倒ですが、いつ変更を加えるかについてすべてを明確に保ちます。最初に、OLE/COM オブジェクト ビューを使用して、VB6 オブジェクトの IDL を取得する必要があります。次に、MIDL コンパイラを使用して typelib を生成します。これからは、typelib を参考にしてください。

VB6 名と競合するため、インターフェイスの名前を変更する必要があります。.NET と VB6 の両方が typelib を参照し、インターフェイスを実装するという考え方です。インターフェイスを更新する必要がある場合はいつでも、IDL を変更し、typelib を再コンパイルして、両方のインターフェイスを実装します。

これが少し複雑に聞こえる場合は、WFT に進みましょう!? 私はあなたを責めません。しかし、私自身の変換プロジェクトでは、VB6 の開発がまだ進行中であるが、.NET で使用する必要がある特定の状況で役立つことがわかりました。

現在、単純化ソリューションは、2 つのコンポーネントが相互運用するために最低限必要なものを特定して分離することです。イベントといくつかのプロパティを言います。そのインターフェイスの IDL を生成します。typelib をコンパイルし、それを参照として使用します。私もそうしました。

于 2009-10-20T19:40:36.127 に答える
0

イベントを変更するときにGUID定数を維持する方法も見つかりませんでした。ただし、.NETアプリでVB6アセンブリのみを使用している場合は、再作成するたびにVB6dllをtlbimpすることができますか。 、.NETでインターフェイスを手動で記述する代わりに、それへの参照を作成しますか?

于 2009-10-20T16:15:42.587 に答える
0

イベントを追加するときに互換性が失われるのを防ぐ方法を見つけたことがありません。残念ながら、これは私が最初に正しくしなければならないことの 1 つです (すべての新しいイベント、パラメーターなどを取得する) ので、互換性を壊すときは、その苦労を 1 回だけ経験する必要があります。

于 2009-10-20T15:44:22.243 に答える