2012-04-18 3 views
4

VB6で使用したいC#COMアクセス可能なDLLを作成しました VB6でCOMオブジェクトをTLBへのハード参照で使用することができました。 私が今やろうとしていますと、この参照を削除し、次のように私はそれを作成してい動的 それをロードすることです:VB6:実行時エラー424 CreateObjectを呼び出すとき

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

私は2番目の行を打つたら、私は実行時エラー424が「必要なオブジェクト」取得します。 しかし、私は次のように作成します:

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

これは問題なく動作します。 なぜ違いがあるのか​​分かりません。とにかく私はまだ物理的な参照を持つ必要があるので、私は2番目のものを使用することはできません。

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

私が使用していても、動的にロードし、別のC#アプリからそれを消費することができました:

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

は前にそのようないずれかの出会い何かしましたか?

+4

と書かれていました。http://support.microsoft.com/kb/245115を読んで、レイトレインバインディングが早い段階からどう違うかを詳しく考えてください。特に、オブジェクトの有効なIDispatchを確認できますか? – rskar

+0

私はC#でそれを後でバインドすることができました。だから、私は自分のコンポーネントが一般的に遅れていると思うでしょう。実際に私のコンストラクタも呼ばれています。 – engmtm

+0

いくつかの追加情報:私のC#dllはVS 2010(.NET 4.0)でビルドされました – engmtm

答えて

1

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

私のオブジェクトはIDipatchを犠牲にしませんでした。だから、私はC#COMインターフェイスをInterfaceType(ComInterfaceType.InterfaceIsDual)で飾るためにそれをやらなければならなかったので、IUnknownとIDispatchの両方を実装しています。 元々はInterfaceType(ComInterfaceType.InterfaceIsIUnknown)

0

とにかく.tlbが必要になると思います。 .NetホスティングはVB6ランタイムとは異なるスレッド上で動作するため、COMオブジェクトはマーシャリングできる必要があります。デフォルトのマーシャリングは、これを行うために型ライブラリの情報を使用します。 IDIspatchには4つのメソッドがあり、そのうちの2つは型情報にアクセスすることです。したがって、ITypeInfoを呼び出すIDispatch COMの作成時に.tlbを削除した場合、登録されたタイプライブラリを読み込めなくなってしまいます。 .tlbを削除すると、マーシャリングできなくなり、インタフェース用のカスタムマーシャラーを用意する必要があります。

+0

別のスレッドで実行される「ネットホスティング」はありません。ComVisibleクラスは、メインのVB6 STAスレッドで作成され呼び出されます。 VB6では、信頼性の高い方法でスレッドをサポートしていないため、マーシャリングを行う必要はありません。 Regasmはインターフェースを登録するために何もしません。 –

+0

あなたのお返事ありがとうございます。解決策は本当に簡単でした。問題は、私のC#COMインターフェイスがIDispatchを犠牲にしなかったということでした。私の最後のコメントを確認してください。 – engmtm

関連する問題