2011-07-10 13 views
1

私はこの問題を約6年前に修正したことを知っています...しかし、そのトリックは何かを覚えていません。VB6 .NET Interopオブジェクトが必要です

私は.NETクラスを持っています。これはCOMで表示されます(ただしCOMには登録されていません)。 COM登録されたクラスへの呼び出しの結果として返されます。だから私のVB6のコードが

Dim instance as Variant 
' call .NET exposed tlb to set instance with a COM visible class 
Dim wrapper as New ComWrapper ' this is a .NET class COM exposed and registered 
Set instance = wrapper.MyClassInstance ' MyClassInstance is an instance of COM visible, but not COM registered MyClass defined below 
instance.DoIt 1 

関連するクラスで終わるMyClassの

public class MyClass 
{ 
    public void DoIt(int id) { ... } 
} 

コールinstance.DoIt 1は例外で、 "必要なオブジェクト" を投げています。私が正しく覚えていれば、VB6が自動的にあなたのために行うことはできませんが、整数1はボックス化またはボックス化されていなくてはならないという事実と関係しています...しかし、それを修正する方法はかなりわかりません。 .. DoItメソッドに引数がない場合は、問題なく動作します...

誰でもこの問題を解決する方法は分かりますか?

ありがとうございました。

答えて

2

VB6の整数は16ビットで囲まれた短いものになります。また、VB6で渡されるデフォルトの引数はByRefです。引数をオブジェクトとして宣言してください。あまりにもずっと前ですが、構文が間違っていると思います。これは、括弧のいずれか

instance.DoIt 1 

または

Call instance.DoIt(1) 

注意する必要があります。この遅れをとる理由はほとんどありません。あなたのクラスが[ComVisible]である限り、それは型ライブラリに存在し、VB6変数型を宣言するだけで、コンパイラがコードをチェックして最適な呼び出しを生成できるようになります。クラスを登録する必要はありません。

Dim instance As MyClass 
+1

MyClassのは、別のDLLであると私は通信のために複数のタイプライブラリを登録する必要はありません。 1つのタイプライブラリを登録するのが面倒です。 – Jeff

+0

タイプライブラリを登録しません*しません。 VB6でProject + Referencesを使って、.tlbを追加して参照してください。 –

+0

私が知っている限り、dllはregasm経由でtlbとして登録されるという要件を追加しています。この2番目のアセンブリは、.NET COM Visible、非regasmのクラスライブラリです。 – Jeff

0

instanceへのレイトバインドをObjectと宣言してください。

関連する問題