1

現在、HP の Quality Center へのコネクタ DLL を開発中です。サーバーに接続するために彼らの(説明文を挿入)COM APIを使用しています。Interop ラッパーは、VStudio によって自動的に作成されます。

私のソリューションには、DLL とテスター アプリケーションの 2 つのプロジェクトがあります。基本的には、DLL 内の関数を呼び出すボタンを含むフォームです。すべてがうまく機能します。欠陥を作成し、更新し、削除できます。メイン フォームを閉じると、アプリケーションが正常に停止します。

しかし、使用可能なすべてのプロジェクトのリストを返す関数を呼び出すと (コンボ ボックスに入力するため)、メイン フォームを閉じると、VStudio はソリューションを実行中として表示し、停止する必要があります。

コード内の単一の関数を特定することができました。これを呼び出すと、ソリューションは「ハング」したままになり、そうでない場合はうまく閉じます。これは、 (.Net ではなく、COM ライブラリの型)get_VisibleProjectsを返すTDC オブジェクトのプロパティへの呼び出しです。それを反復処理して、適切なリストを返します (後でコンボ ボックスを埋めるために使用します)。 List:

    public List<string> GetAvailableProjects()
    {
        List<string> projects = new List<string>();
        foreach (string project in this.tdc.get_VisibleProjects(qcDomain))
        {
            projects.Add(project);
        }
        return projects;
    }

私の仮定は、何かがメモリに保持されるということです。VStudio の外部で EXE を実行すると、EXE は終了しますが、メモリに何が残るかは誰にもわかりません。

私の質問は、このプロパティを呼び出して返されるものを取り除くにはどうすればよいですか? GCはこれを処理すべきではありませんか? ポインターを詳しく調べる必要がありますか?

私が試したこと:

  1. リストを変数に取得し、関数の最後で null に設定する
  2. クラスにデストラクタを追加し、tdcオブジェクトを null にする
  3. テスター関数アプリケーションを最後までステップ実行すると、フォームが閉じて Main 関数が終了します。フォームは閉じますが、VStudio はまだ実行中であることを示しています。

ご協力ありがとうございます。

4

4 に答える 4

0

終了したら、System.Runtime.InteropServices.Marshal.ReleaseComObjectを使用してListオブジェクトを手動で解放しようとしましたか?

于 2010-05-09T09:01:43.720 に答える
0

ぶら下がっているスレッドがいくつかあると思います。

これが発生した場合は、デバッガーでプロセスを一時停止し、まだ存在しているスレッドを確認してください。

于 2010-05-09T09:14:38.150 に答える
0

次の 2 行をビルド後のイベントに追加してみてください。

call "$(DevEnvDir)..\Tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"
于 2010-08-11T13:02:53.377 に答える
0

次のようなイテレータを使用する代わりに、カウントとアイテムのプロパティを使用して、リストを手動で反復しようとする場合があります。

for (int i=1; i <= lst.Count ; ++i)
{
 string projectName = lst.Item(i);
}

イテレータを使用しなくても問題がない場合、リストオブジェクト自体ではなく、それを維持するのはイテレータである可能性があります。

于 2010-05-13T06:39:56.303 に答える