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の登録ではなくなります。
これはタイミングの問題である可能性がありますか? 'foo = Nothing'を設定してしばらく待ってから、ファイルを削除してください。実際にロックを解除するには、いくつかの指示が必要です。 'GC.Collect'と' ReleaseComObject'もやはり試してみる必要があるかもしれません。 –
タイミングのせいではありません。私は 'foo = Nothing'と' File.Delete'の間にいくつかの追加的な指示があったので、これをトラブルシューティングする際に様々な点で助けになりませんでした。私はこれも当初考えていましたが、ファイルが適切にロック解除されるには処理が速すぎるだけでしたが、この場合は問題ではないようです。 – Kettch19