0

これで何ができるか本当にわかりませんが、誰かが助けてくれることを願っています

基本的に私はcomインターフェイスを介してデスクトップ会計システムと情報を交換するシステムを開発しました

私が行ったことは、com ライブラリのプロジェクト参照を .net プロジェクトに追加し、コードで新しいインスタンスを作成することです

Dim myObject as New AccountingLibraryType

これにより、目に見えるプロパティ、プロシージャ、関数などにアクセスできます。

myObject.Login("Login details go here")

この部分はすべて正常に動作します

私の問題は、オブジェクトのインスタンスでの作業が終了したときに始まります。何をしても、プロセスがまだ実行されていることがよくあります

オブジェクトを破棄するときは、次のことを行います

myObject.Logout 'As per Accounting software developers,  should close process
GC.Collect()
Marshel.ReleaseComObject(myObject) ' Also tried Marshal.FinalReleaseComObject(myObject)
myObject = Nothing

このすべての後でも、プロセスはタスクマネージャーで実行されたままです。

ProgID によるプロセスの取得を調査しましたが、残念ながら、エンド ユーザーは通常、会計ソフトウェアで直接作業しているため、適切なプロセスを確実に取得する方法がありません。

私が見る限り、そのプロセスを識別するために com オブジェクトで利用できるものはありません。属性コレクションを取得できることがわかりましたが、そこから正しいプロセスに到達する方法がわかりません

Dim attributes As AttributeCollection
attributes = TypeDescriptor.GetAttributes(GetType(AccountingLibraryType))

最初に、プロセスが終了したときにプロセスが完全に終了するようにするために他にできることはありますか?

第二に、プロセスの何らかの形のハンドルを取得できるオブジェクトインスタンスを作成できるより良い方法がありますが、表示されているプロパティとメソッドにアクセスできます。Process と StartInfo を見てきましたが、必要なメソッドなどに到達する方法が実際にはわかりませんでした

会計ソフトの場合、内部ガベージコレクションに問題があるのではないかと思います。私は彼らにこの件について何度も話しましたが、彼らはそれについて何もしたくありません。

どんな助けにも感謝します

4

1 に答える 1

0

探しているものは次のとおりです。

Marshal.FinalReleaseComObject(myObject)
myObject = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()

また、破棄する必要のある子オブジェクトがないことを確認するCOM必要があります。その場合は、逆の順序で破棄します。

于 2013-11-15T02:00:25.153 に答える