私は .Net 1.1 アプリケーションに行き詰まっており (つまり、今のところ 2.0 のジェネリック機能を使用できません)、コードの一部を最適化しようとしていました。リリースする必要があるランタイム呼び出し可能なラッパーを多く扱うため、すべての参照がリリースされるまでループするユーティリティ メソッドを作成することになりました。メソッドのシグネチャは次のとおりです。
void ReleaseObject(object comObject)
すべての comObjects を解放した後、GC.Collect と GC.WaitForPendingFinalizers を呼び出します (質問しないでください - Office の相互運用を扱っている人なら誰でも知っています)。
そして ... いつものように、まれなケースに遭遇します。GC.Collect 呼び出しの前に、対応するマネージド参照を null に割り当てないと、適切にクリーンアップされません。
したがって、私のコードは次のようになります。
ReleaseObject(myComObject);
myComObject = null;
GC.Collect()
...
xxx=null がたくさんあるので、これを util メソッドに入れることにしましたが、参照渡しと参照パラメーターの受け渡しには違いがあるため、明らかにメソッドを次のように変更する必要がありました。
void ReleaseObject(out object comObject)
{
//do release
comObject = null;
}
呼び出し元を次のように編集します。
MyComClass myComObject = xxxx;
ReleaseObject(out myComObject);
これは、「'out MyComClass' から 'out object' に変換できません」というメッセージで失敗します。
なぜそれが問題になるのか (つまり、オブジェクトから MyComClass へのリバース キャストは暗黙的ではなく、メソッドが何を行うか保証されていない) を考えることはできますが、回避策があるかどうかは疑問に思っていました。私の何百ものヌルの割り当てで。
注: 私はさまざまな COM オブジェクト タイプを持っているため、タイプ セーフではなく「オブジェクト」パラメータが必要です。