以编程方式构建 - 未从程序集中加载“TransformTemplates”任务

Posted

技术标签:

【中文标题】以编程方式构建 - 未从程序集中加载“TransformTemplates”任务【英文标题】:Build programmatically - The "TransformTemplates" task was not loaded from assembly 【发布时间】:2021-02-17 12:11:45 【问题描述】:

我正在尝试使用 Microsoft.Build.Execution 以编程方式构建一些应用程序,但是我遇到了以下错误:

“TransformTemplates”任务未从程序集 C:\Program 加载 文件 (x86)\Microsoft Visual Studio \2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.Build.Tasks.dll。 无法加载文件或程序集“Microsoft.Build.Utilities.Core, 版本 = 15.0.0.0,文化 = 中性,PublicKeyToken = b03f5f7f11d50a3a' 或其依赖项之一。系统找不到 指定的文件。确认声明是 正确,程序集及其所有依赖项都可用并且 该任务包含一个公共类,该类实现 Microsoft.Build.Framework.ITask

我的代码实现了:

Dictionary<string, string> globalProperties = new Dictionary<string, string>() 
                         "RebuildT4Templates" , "true" ,
                         "VSToolsPath", @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0" ,
                         "LangVersion", "6" ,
                         "ToolsVersion", "15.0" ,
                         "VisualStudioVersion", "15.0" 
                    ;
var manager = BuildManager.DefaultBuildManager;
var buildLoggger = new InMemoryBuildLogger();
var buildParameters = new BuildParameters()  Loggers = new[]  buildLoggger  ;
var buildRequestData = new BuildRequestData(csProj, globalProperties, null, new[]  "Rebuild" , null);
var buildResult = manager.Build(buildParameters, buildRequestData);

我正在尝试构建的.Csproj 文件。

<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <!-- Run the Transform task at the start of every build -->
    <TransformOnBuild>true</TransformOnBuild>
    <!-- -->
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <!-- Transform every template every time -->
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
  </PropertyGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
  <!-- add AFTER import for $(MSBuildToolsPath)\Microsoft.CSharp.targets -->
  <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
  <ItemGroup>
    <T4ParameterValues Include="BuildConfiguration">
      <Value>$(Configuration)</Value>
      <Visible>False</Visible>
    </T4ParameterValues>
  </ItemGroup>
  <Target Name="CreateT4ItemListsForMSBuildCustomTool" BeforeTargets="CreateT4ItemLists" AfterTargets="SelectItemsForTransform">
    <ItemGroup>
      <T4Transform Include="@(CreateT4ItemListsInputs)" Condition="'%(CreateT4ItemListsInputs.Generator)' == 'MSBuild:TransformAll'" />
    </ItemGroup>
  </Target>

关于如何解决这个问题的任何想法?似乎 MSBuild 没有构建 T4Template 所需的依赖项

【问题讨论】:

您是如何在项目中引用Microsoft.Build.Utilities.Core.dll 的?它的程序集dll版本是什么?你试过使用C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Build.Utilities.Core.dll吗? 【参考方案1】:

作为建议,我认为您应该通过右键单击 References-->Add Reference--> 来引用 dll 程序集-->扩展-->找到Microsoft.Build.Utilities.Core.dll,然后引用它。

================================

更新 1

也许你应该更新你的VS2017,它不是最新版本,而我这边的新版本使用该dll的15.1.0.0

所以我不确定你的旧VS2017是否使用15.0.0.0版本,它使用msbuild.exe.config文件下的15.0.0.0。如果没有,您应该更新您的 VS2017

1) 或在app.configweb.config 文件上添加绑定重定向:

 <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Build.Utilities.Core" publicKeyToken="xxxxx"/>
        <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="15.1.0.0"/>
      </dependentAssembly>
 </assemblyBinding>
 </runtime>

2) 检查C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe.config 并确保有与上述Microsoft.Build.Utilities.Core 相同的绑定重定向。

3) 如果没有,你应该尝试安装Microsoft.Build 15.1.xnuget 包和Microsoft.Build.Runtime 15.1.xnuget 包。 然后,为它们添加绑定重定向。

【讨论】:

即使添加此引用,错误仍然存​​在。从我看到的对“Microsoft.Build.Utilities.Core”的引用来看,我指的是版本 15.1.0.0,而不是 15.0.0.0,这是必要的......我在 15.0.0.0 版本中没有找到这个二进制文件在我的机器上 感谢您的反馈。由于您使用了Microsoft.Build.Utilities.Core 15.1.0.0,我认为您应该尝试将bindredirect 添加到15.1.0.0。请查看update 1

以上是关于以编程方式构建 - 未从程序集中加载“TransformTemplates”任务的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用程序未从快捷方式启动

Android ADT 错误,dx.jar 未从 SDK 文件夹加载

以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件

如何以编程方式替换 .NET 程序集中的嵌入式资源?

未从同一目录加载 C++ PDB 符号

以编程方式更改 .net 强类型数据集中的表名