2017-11-03 4 views
1

ロックを取得する原因となりますこれは、私のアプリケーションがソリューションパッケージフォルダからメモリにDLLをロードしたためです。はnugetパッケージDLLは、私は、次のコードを実行しています

具体的 Microsoft.Bcl.Build.Tasks.dll

この1つのファイルは私のアプリケーションで「使用中」になってしまいますので、アプリケーションが終了するまで、私のアプリケーションは、一時ディレクトリを削除することはできません。
チキンとエッグ - フォルダがなくなるまでアプリケーションを閉じたくないので、アプリケーションが終了するまでフォルダを削除できません。

誰もが知っている解決策はありますか?
例:
DLLがアプリケーションにロードされると、それは永続的で、伝統的にリリースすることはできません。
しかし、私は過去に、アプリケーション内で追加のAppDomainsを作成し、メインアプリケーションの代わりにアセンブリをAppDomainsに読み込んでAppDomainと関連する参照/アセンブリを処分できると聞いています。ハンドル?

注 - 私は上記のNugetパッケージの復元を呼び出していることを知っていますが、コードをステップ実行すると、確実にロックがビルドステップで発生し、ナゲットの復元では発生しません。

答えて

1

BuildManagerを使用せずに同様の問題が発生しましたが、ビルドファイルを使用しましたが、msbuildプロセスを実行しても同様のエラーが発生しました。

私はタスクマネージャーを見て、いくつかのファイルをロックした状態のmsbuildプロセスがいくつかあることに気付きました。

msbuildにはnodereuseという名前のものがあり、プロセスの一部をアクティブに保ち、さらなるビルドが高速になるためです。

あなたは、次のmsbuildパラメータを使用することができ、この無効にする場合:

/nodeReuse:値 OR /NR:値
は、MSBuildのノードの再利用を有効または無効にします。
次の値を指定できます。

  • Trueです。ビルドが完了した後もノードは残っているため、後続のビルドでも使用できます(デフォルト)。
  • False。ビルドが完了してもノードは残っていません。

ノードは実行中のプロジェクトに対応します。/maxcpucountスイッチを含めると、複数のノードを同時に実行できます。

このパラメータをfalseに設定すると、すべてのロックされたファイルの問題はなくなりました。多分これもあなたを助けるでしょう。この問題を解決していない

1

これは、「これ以上の要求が予想される(または許可)されて構築し、BuildManagerをクリーンアップすること」という合図しないだろうとあなたは、あなたがそれを配置する前BuildManager.DefaultBuildManager.EndBuild()を呼び出すこともできます

+0

残念ながら。この問題は、BuildManagerクラスではそれほど重要ではありません.Dllがホストアプリケーションに読み込まれていて、アンロードされていないということのほうが関係しています。 C#dllのアンロードを邪魔します。これにより、このMicrosoft BCL dllがロックされることに対応することが不可能に近づきます。 – Baaleos

+0

ちょうどアイデアだが、別のAppDomainがそのトリックを行うべきである。基本的にそこにすべてのものをロードして、完了したら破壊することができるからだ! –

+0

あまりにもうまくいきませんでした。 私はビルド全体を実行して、プロキシドメイン内でプロセスを実行しようとしました。 実際の参照/ assembly.load()ではなくdspがプロジェクト/ターゲットインポートとしてcsprojによってロードされていたためだと思います。 – Baaleos

関連する問題