代码之家  ›  专栏  ›  技术社区  ›  Craig Shearer

如何将Msbuild中的SGEN toolpath设置为target 3.5 framework

  •  17
  • Craig Shearer  · 技术社区  · 16 年前

    “无法加载文件或程序集'XXXX.XXXX.XmlSerializers'或其依赖项之一。此程序集由比当前加载的运行时新的运行时生成,因此无法加载。“

    Sgen任务如下所示:

      <Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
        <!-- Delete the file because I can't figure out how to force the SGen task. -->
        <Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
        <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
          <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
        </SGen>
      </Target>
    

    这就是

    还有一个类似的问题 here 但对我没什么帮助。

    5 回复  |  直到 9 年前
        1
  •  18
  •   Michael Freidgeim    10 年前

    我已经通过手动配置ToolPath来解决这个问题,使其指向sgen.exe的旧版本(版本2.0.50727.3038)

    我将刀轨属性更改为:

    ToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin"
    

    默认情况下,它运行的是新的4.0框架版本:C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0 Tools

        2
  •  17
  •   Justin Dearing    14 年前

    MSBuild使用注册表获取v3.5工具的路径。如果无法识别3.5工具的路径,则需要v3.5 SDK工具的MSBuild任务将退回到v4.0路径-如果您确实感兴趣,请查看用于在C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.NETFramework.props中设置TargetFrameworkSDK工具目录属性的逻辑。

    您可以按以下方式诊断和修复此问题:

    安装 Process Monitor 并设置筛选器以监视msbuild对注册表的访问(事件类:registry,进程名:msbuild.exe,所有类型的结果)。

    运行你的构建。

    在进程监视器中搜索与“MSBuild\ToolsVersions\4.0\SDK35ToolsPath”匹配的RegQueryValue访问。请注意,这可能位于“HKEY\ U LOCAL\ U MACHINE\SOFTWARE\Microsoft”或“HKEY\ U LOCAL\ U MACHINE\SOFTWARE\Wow6432Node\Microsoft”下。

    如果您查看注册表中的这个键,就会发现它与另一个注册表值有别名,例如“$(Registry:HKEY_LOCAL_MACHINE\软件\Microsoft\Microsoft SDK\Windows\v7.1\WinSDK-NetFx35Tools-x86@InstallationFolder)"

    应该清楚你需要纠正什么。我选择导出不正确的密钥,编辑.reg文件并运行它来创建正确的密钥。

    http://connect.microsoft.com/VisualStudio/feedback/details/594338/tfs-2010-build-agent-and-windows-7-1-sdk-targeting-net-3-5-generates-wrong-embedded-resources

        3
  •  7
  •   Anssssss    13 年前

    我发现这是最简单的方法,它适用于:<生成序列化程序集>打开</生成序列化程序集>

    <SGenToolPath>C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin</SGenToolPath>
    
        4
  •  7
  •   T.S.    11 年前

    问题是 $(SGenToolPath) 不是由MSBuild设置的。如果你使用 $(TargetFrameworkSDKToolsDirectory) 然后它将尝试根据 $(TargetFrameworkVersion)

    <Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
      <Message Text="SGenPath: $(SGenPath)" Importance="high"/>
      <Message Text="TargetFrameworkVersion: $(TargetFrameworkVersion)" Importance="high"/>
      <Message Text="TargetFrameworkSDKToolsDirectory : $(TargetFrameworkSDKToolsDirectory )" Importance="high"/>
    
        5
  •  5
  •   pattersonc    16 年前

    @克雷格-你是否在你的构建机器上手动安装了7.0A框架。如果是这样,您的问题可能是注册表设置,而不是msbuild。查看LocalMachine->软件->微软->MSBuild->工具版本->4.0->SDK35ToolsPath并确保引用的注册表项有效(提示:确保只有在-x86键存在时-x86才存在。)