c# - 启动时应用程序中的 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);
我有点不知所措,因为这些信息似乎相互矛盾。我在网上也找不到任何帮助。
解决方案
推荐阅读
- android - 是否有可能在 Android 10 的主屏幕小部件中粘贴剪贴板的内容?
- openssl - 如何在命令上使用 OpenSSL 生成 MAC 值?
- c# - OrderByKey().LimitToLast 返回旧的 DataSnapshot 并且不返回新的 Key
- html - 不存在某种类型的同级时的 CSS 选择器
- amazon-web-services - 与可公开访问的 AWS RDS 数据库相关的风险
- r - 如何在不同条件下根据参考过滤数据帧
- java - 如何防止程序删除方法中的最后一个索引
- c# - asmx 方法始终充当 HttpGet
- python - Python 中 wx.html2 的 GetPageSource
- pyspark - 空时从引发异常的火花中读取.parquet文件