4

VB6で使用したいC#COMアクセス可能なdllを作成しました。TLBへのハードリファレンスを使用して、COMオブジェクトをVB6で使用できました。私が今やろうとしているのは、この参照を削除して動的にロードすることです。次のように作成しています。

Dim keylok As Object
Set keylok = CreateObject("MyClassLib.MyObject")

2行目にヒットすると、ランタイムエラー424「ObjectRequired」が発生します。しかし、私がそれを次のように作成するとき:

Dim keylok As MyObject
Set keylok = CreateObject("MyClassLib.MyObject")

正常に動作します。なぜそれが違いを生むのかわかりません。とにかく、私はまだ物理的な参照を持っている必要があるので、2番目のものを使用することはできません。

また、COMオブジェクトコンストラクターのファイルに実際に呼び出されるかどうかを書き込むための一種のデバッグとしても試しました。はい、そうです。コンストラクター内でCOMオブジェクト内の他のメソッドを正常に呼び出すこともできます。

次を使用して、動的にロードして別のC#アプリから使用することもできました。

dynamic myObj = Activator.CreateInstance(Type.GetTypeFromProgID("MyClassLib.MyObject"));

以前にそのようなものに遭遇した人はいますか?

4

2 に答える 2

1

@rskar入力の助けを借りて解決策を見つけました。だから、誰かが同じ問題に直面した場合に備えて、私は私の質問に答えるつもりだと思いました。

私のオブジェクトはIDsipatchを影響しませんでした。つまり、C#COMインターフェイスを装飾するために必要なことはすべてInterfaceType(ComInterfaceType.InterfaceIsDual)、IUnknownとIDispatchの両方を実装することです。もともとそれはで飾られていましたInterfaceType(ComInterfaceType.InterfaceIsIUnknown)

于 2012-04-19T19:54:23.650 に答える
0

とにかく.tlbが必要になると思います。.NetホスティングはVB6ランタイムとは異なるスレッドで実行されるため、COMオブジェクトはマーシャリングできる必要があります。デフォルトのマーシャリングでは、タイプライブラリからの情報を使用してこれを行います。IDIspatchには4つのメソッドがあり、そのうちの2つはタイプ情報へのアクセスに関係しています。したがって、.tlbを削除した場合、IDispatchを作成すると、COMはこれからITypeInfoを呼び出そうとし、登録されたタイプライブラリのロードに失敗して終了します。.tlbを削除すると、マーシャリングできなくなり、インターフェイスにカスタムマーシャラーを提供する必要が生じる可能性があります。

于 2012-04-19T16:13:43.220 に答える