我正在执行以下代码:
public static BuildResult Compile(string projectFilePath)
{
Nuget.NugetRestore(projectFilePath);
ProjectCollection pc = new ProjectCollection();
Dictionary<string, string> globalProperty = new Dictionary<string, string>();
globalProperty.Add("nodeReuse","false");
BuildParameters bp = new BuildParameters(pc);
BuildRequestData buildRequest = new BuildRequestData(
projectFilePath, globalProperty, "4.0", new string[] { "Clean", "Build" }, null);
BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest);
BuildManager.DefaultBuildManager.Dispose();
return buildResult;
}但是,当生成任务完成后,当我尝试删除文件夹时-我被阻止这样做,因为我的应用程序已将DLL从解决方案包文件夹加载到内存中。
特别是Microsoft.Bcl.Build.Tasks.dll
因为这一个文件最终在我的应用程序中“正在使用”,所以我的应用程序在应用程序关闭之前不能删除临时目录。
鸡和蛋-我不想在文件夹消失之前关闭应用程序,并且在应用程序关闭之前我不能删除文件夹。
谁有任何已知有效的解决方案?
例如:
我知道,一旦DLL加载到应用程序中,它就是永久性的,传统上不能释放。
然而,我过去听说你可以在应用程序中创建额外的AppDomains,然后将程序集加载到AppDomains中,而不是主应用程序中,然后你可以处理AppDomain和相关的引用/程序集,我希望...把手?
注意--我知道我在上面调用Nuget package restore,但是通过代码单步执行,我可以明确地说锁定发生在构建步骤,而不是nuget恢复。
发布于 2017-11-06 18:48:13
我曾经遇到过类似的问题,但由于没有使用BuildManager,我使用了一个构建文件,在运行msbuild进程时,我注意到了一个类似的错误。
当我查看任务管理器时,我注意到有几个msbuild进程锁定了一些文件。
这是因为msbuild有一个名为nodereuse的东西,它可以让一些进程保持活动状态,这样进一步的构建就会更快。
如果您想禁用此功能,可以使用以下msbuild参数:
/nodeReuse:value或/nr:value
启用或禁用MSBuild节点的重用。
您可以指定以下值:
一个节点对应一个正在执行的项目。如果包含/maxcpucount开关,则可以同时执行多个节点。
在我将这个参数设置为false后,我所有的锁定文件问题都消失了。也许这也会对你有帮助。
发布于 2017-11-06 18:55:52
在处理它之前,您可能希望调用BuildManager.DefaultBuildManager.EndBuild(),因为这将发出信号,表示“不再期望(或允许)构建请求,并且BuildManager可能会被清除”。
https://stackoverflow.com/questions/47099927
复制相似问题