首页 > 解决方案 > 启动时应用程序中的 MSBuild 15/16 FileNotFoundException

问题描述

我有一个使用旧 MSBuild 的工具,直到现在终于升级到 MSBuild 15/16。
我已按照文档中的指南更改参考,因为从 MSBuild 15 开始,这些不再安装到 GAC:https ://docs.microsoft.com/en-us/visualstudio/msbuild/updating- an-existing-application?view=vs-2019
我使用了最新的 NuGet 包并按应有的方式配置了所有内容。它构建得很好,但是每当我运行程序时,它会立即崩溃并抱怨"Microsoft.Build.Framework, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"找不到。它在上面的指南中明确指出:

如果您使用应用程序重新分发 Microsoft.Build.Locator.dll,则无需分发其他 MSBuild 程序集。

这发生在Main执行任何代码之前。如果我尝试通过项目设置将此文件复制到输出路径,则构建将失败并显示一条消息,指出不应执行此操作。

您的项目中存在不带 ExcludeAssets="runtime" 的对 Microsoft.Build.* 的 PackageReference。这将导致 MSBuild 程序集被复制到您的输出目录,从而导致您的应用程序在运行时加载它们。要使用由 MSBuildLocator 注册的 MSBuild 副本,请在 MSBuild PackageReferences 上设置 ExcludeAssets="runtime"。要禁用此检查,请在项目文件中设置属性 DisableMSBuildAssemblyCopyCheck=true(不推荐,因为您必须分发所有 MSBuild + 相关工具集)。引用的包:Microsoft.Build;Microsoft.Build.Framework;Microsoft.Build.Utilities.Core

该项目使用以下参考:

<PackageReference Include="Microsoft.Build">
  <Version>16.6.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Build.Framework">
  <Version>16.6.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Build.Locator">
  <Version>1.2.6</Version>
</PackageReference>
<PackageReference Include="Microsoft.Build.Utilities.Core">
  <Version>16.6.0</Version>
</PackageReference>
<PackageReference Include="NuGet.VisualStudio">
  <Version>5.6.0</Version>
</PackageReference>

如果我省略了任何 MSBuild,编译也会因为缺少引用而失败。编译本身是在后台任务的不同类中完成的。

...
logger = new ControlLogger();
logger.LogEvent += new ControlLogger.LogEventHandler(ControlLogEventHandler);
logger.Verbosity = Verbosity;
logger.LogToFile = true;
logger.Parameters = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "Logs", Path.GetFileNameWithoutExtension(FileName) + ".txt");
BuildParameters bp = new BuildParameters(pc);
bp.Loggers = new List<ILogger>() { logger };
BuildRequestData buildRequest = new BuildRequestData(Path.Combine(FilePath, FileName), globalProperty, null, new string[] { Target }, null);
return new Tuple<BuildResult, bool>(BuildManager.DefaultBuildManager.Build(bp, buildRequest), true);

我有点不知所措,因为这些信息似乎相互矛盾。我在网上也找不到任何帮助。

标签: c#.netmsbuild

解决方案


推荐阅读