(編集: msbuild に関する本を文字通り書いたSayed Ibrahim Hashimiは、より良いアプローチのためにAppDomainIsolatedTaskクラスを提案しています)
私はこれを自分で解決することができました...
Microsoft の MSBuild 開発者の 1 人であるDan Moseley による次のフォーラム投稿を見つけました。
やあ、
残念ながら、これは MSBuild がタスク アセンブリをプライマリ アプリケーション ドメインに読み込むためです。CLR では、アセンブリが appdomain からアンロードされることは許可されていません。これにより、重要な最適化が可能になるからです。
私が提案する唯一の回避策は、tomsbuild.exe を呼び出して、タスクを使用するプロジェクトをビルドすることです。これを行うには、MSBuild.exe <> を VS の外部ツールとして作成します。
msbuild のDan
開発者
DanMoseley - MSFT
したがって、ロックを停止するには、新しい MSBuild.exe プロセスを生成する必要があるようです。MSBuild が実行されると、Visual Studio のプライマリ アプリ ドメインにタスクが読み込まれ、決してアンロードできないためです。
「ビルド」ターゲットをオーバーライドし、カスタム アクションを実行する新しい MSBuild プロジェクト (.csproj など) を作成します。
<!-- fragment of Prebuild.csproj -->
<Target Name="Build">
<BuildOrmLayerTask Repository="$(Repository)" />
</Target>
必要に応じて Visual Studio に追加しますが、Configuration Manager を使用して、どの構成にも組み込まれていないことを確認してください。ビルドではなく、VSにソース管理などを任せてください。
に依存するプロジェクトの .csproj ファイルを編集しますPrebuild.csproj
。BeforeBuild
タスクを使用して MSBuild を呼び出すターゲットを追加しExec
ます。これにより新しいプロセスが開始され、そのプロセスが終了すると、ファイルのロックが解除されます。例;
<PropertyGroup>
<PrebuildProject>$(SolutionDir)Prebuild\Prebuild.csproj</PrebuildProject>
</PropertyGroup>
<Target Name="BeforeBuild">
<Exec Command="msbuild.exe "$(PrebuildProject)"" />
</Target>
これで、依存プロジェクトをビルドすると、コンパイルを実行する前に新しいプロセスで MSBuild が実行されます。