0

COM 相互運用用に登録した単純な C# ライブラリがあります。これの参照を vb6 アプリに追加しました。vb アプリケーションを実行したところ、すべて正常に動作しました。私が知りたいのは、これがどのように機能するかです。タスクマネージャーを確認したところ、プロセスに VB6.exe が表示されていますが、.net に関連するものは何も表示されません。

コード: vb6

Dim a As CsharpdllForVBHack.ComAdder
Private Sub Command1_Click()
    Set a = New CsharpdllForVBHack.ComAdder
    a.Add 1, 4
End Sub

コード: C#.net

 [ComVisible(true)]
 public class ComAdder
 {
    [ComVisible(true)]
    public void add (int a,int b)
    {
        TestForm testForm = new TestForm(a+b);
        testForm.ShowDialog();
    }
 }

また、完了したら、このcomオブジェクトの破棄をどのように処理するかを知りたいです

ボタンをクリックしてフォームを閉じるたびに、 set a= Nothing を追加しても、使用されるメモリが数 100 kb 増加することに気付きました。

4

2 に答える 2

5

あなたの場合、VB は .NET アセンブリ内に存在する COM Callable ラッパー クラス (CCW) をインスタンス化します。通常の COM タイプの処理がここで行われます。まず、COM はレジストリでクラスの GUID を検索し、VB コンポーネントのプロセスにロードするアセンブリ DLL を見つけます。COM は、COM クラスのインスタンス化に使用する標準 COM インターフェイスへのポインタを取得する関数を見つけようとします。これで、COM オブジェクトが作成されました。

しかし、それだけではありません。CCW をインスタンス化すると、.NET ランタイムが読み込まれることも確認され、.NET クラスのインスタンスが作成されます。COM オブジェクトには、.NET インターフェイスに基づくインターフェイスがあります。CCW は基本的に、すべての呼び出しを COM インターフェイスから .NET インターフェイスに転送し、COM データ型を .NET データ型に変換し、戻り値と出力パラメーターがある場合は再び元に戻します。

2 番目のポイントについては、この特定のケースでは気にしないでください。VB がプロシージャの最後に到達する (または Exit Sub を実行する、またはエラーを発生させる) と、VB はすべてのプロシージャ レベルの変数をクリアするサブルーチンにジャンプします。オブジェクト変数がクリアされると、COM オブジェクトへの参照カウントが減少します。参照カウントがゼロの場合、COM インスタンスはそれ自体を強制終了します。

あなたの場合、COM クラスが自分自身を強制終了すると、.NET オブジェクトが確実に破棄されるように極端な手段が取られますが、すべての .NET オブジェクトと同様に、この動作に依存することはできません。

于 2012-07-24T12:22:11.827 に答える
3

質問の最初の部分は広すぎてここで答えることができません。この主題に関する詳細については、 COM相互運用機能を参照してください。

あなたの質問の2番目の部分は次のように答えられます:

VB6でオブジェクトを破棄するには、次のようにします。

Set a = Nothing

他の参照が残っていないことを確認してください。

于 2012-07-24T09:59:24.953 に答える