2011-12-21 6 views
0

DLLを生成する.Net 4 WinFormsアプリケーションがあり、生成されたDLLにCreateObjectが呼び出され、DLLに含まれるいくつかのメソッドの1つが呼び出されます。 DLLは最終的に別のアプリで使用されます。このWinFormsアプリケーションはDLLを生成してテストするだけで、なぜDLLを何回も生成できます。`CreateObject`でインスタンス化されたCOM DLLのファイルロックを解放します

問題は、DLL上でCreateObjectを呼び出すと、ファイルがプロセスにロックされるという事実にあります。次回にDLLを生成すると、アプリケーションを完全に閉じずに再起動することなく、ディスク上の前のDLLファイルを上書きすることはできません。私も手動でロック解除にGC.Collect()や他のものの全体のホストが、どれも結果を呼び出し、CreateObjectを経由して別のCOMオブジェクトにCOMオブジェクトを保持する変数を設定し、別のAppDomainのでCreateObjectを実行し、Marshal.ReleaseComObjectを試してみた

ファイル。

コードフローは、基本的に(簡略化および一般名、等)である:

... 
' Compile and generate DLL that is COM enabled and works fine 
... 

Dim foo As Object = CreateObject("Bar.Foo") 
foo.callMethod() 

... 
' Succeeds or fails then continues 
... 

... 
' Clean up and remove the generated DLL  
foo = Nothing 
File.Delete("C:\myassembly.dll") 
... 

かなり標準的な用法。だから私の質問です:プロセスを殺すことなくCreateObject経由でインスタンス化されているCOM DLLのファイルロックを解放する方法はありますか?

注:これはthis original issueの続きです。ファイルをロックせずにDLLを登録するようになりましたが、問題はCreateObject呼び出しでDLLの登録ではなくなります。

+0

これはタイミングの問題である可能性がありますか? 'foo = Nothing'を設定してしばらく待ってから、ファイルを削除してください。実際にロックを解除するには、いくつかの指示が必要です。 'GC.Collect'と' ReleaseComObject'もやはり試してみる必要があるかもしれません。 –

+0

タイミングのせいではありません。私は 'foo = Nothing'と' File.Delete'の間にいくつかの追加的な指示があったので、これをトラブルシューティングする際に様々な点で助けになりませんでした。私はこれも当初考えていましたが、ファイルが適切にロック解除されるには処理が速すぎるだけでしたが、この場合は問題ではないようです。 – Kettch19

答えて

1

COMオブジェクトを解放するためにはMarshal.ReleaseComObject(foo)を実行し、次にCOMでロードされたDLLをアンロードするにはP/Invoke CoFreeUnusedLibrariesを実行してください。

+0

私は 'Marshal.ReleaseComObject(foo)'を呼び出すたびに 'オブジェクトの型は__ComObjectか__ComObjectから派生していなければなりません。 'ComClass'と' ComVisible'デコレータのすべてを持っているにもかかわらず、これは本当のCOMクラスではないと思えるようです。ウォッチウィンドウで見ると、実際には "__ComObject"の代わりに "Bar.Foo"のタイプが与えられています。私は何かねじを締めましたか? – Kettch19

関連する問題