sgen.exe 在构建期间失败

Posted

技术标签:

【中文标题】sgen.exe 在构建期间失败【英文标题】:sgen.exe fails during build 【发布时间】:2010-09-05 14:49:45 【问题描述】:

在更改了 Visual Studio 项目的输出目录后,它开始无法构建,并出现如下错误:

C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin\sgen.exe /assembly:C:\p4root\Zantaz\trunk\EASDiscovery\EASDiscoveryCaseManagement\obj\Release\EASDiscoveryCaseManagement.dll /proxytypes /reference:C:\p4root\Zantaz\trunk\EASDiscovery\EasDiscovery.Common\target\win_x32\release\results\EASDiscovery.Common.dll /reference:C:\p4root\Zantaz\trunk\EASDiscovery\EasDiscovery.Export\target\win_x32\release\results\EASDiscovery.Export.dll /reference:c:\p4root\Zantaz\trunk\EASDiscovery\ItemCache\target\win_x32\release\results\EasDiscovery.ItemCache.dll /reference:c:\p4root\Zantaz\trunk\EASDiscovery\RetrievalEngine\target\win_x32\release\results\EasDiscovery.RetrievalEngine.dll /reference:C:\p4root\Zantaz\trunk\EASDiscovery\EASDiscoveryJobs\target\win_x32\release\results\EASDiscoveryJobs.dll /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Shared.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.Misc.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinChart.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinDataSource.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinDock.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinEditors.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinGrid.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinListView.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinMaskedEdit.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinStatusBar.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinTabControl.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinToolbars.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.UltraWinTree.v8.1.dll" /reference:"C:\Program Files\Infragistics\NetAdvantage for .NET 2008 Vol. 1 CLR 2.0\Windows Forms\Bin\Infragistics2.Win.v8.1.dll" /reference:"C:\Program Files\Microsoft Visual Studio 8\ReportViewer\Microsoft.ReportViewer.Common.dll" /reference:"C:\Program Files\Microsoft Visual Studio 8\ReportViewer\Microsoft.ReportViewer.WinForms.dll" /reference:C:\p4root\Zantaz\trunk\EASDiscovery\PreviewControl\target\win_x32\release\results\PreviewControl.dll /reference:C:\p4root\Zantaz\trunk\EASDiscovery\Quartz\src\Quartz\target\win_x32\release\results\Scheduler.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /compiler:/delaysign- 
    Error: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets(1902,9): error MSB6006: "sgen.exe" exited with code 1.

我将输出目录更改为 target/win_x32/release/results 但 sgen 中的路径似乎没有更新。项目中似乎没有提到传递到 sgen 的路径,所以我不确定如何修复它。作为一种解决方法,我禁用了序列化生成,但解决潜在问题会很好。有没有其他人看到过这个?

【问题讨论】:

【参考方案1】:

如果您在以 Release 模式构建 VS.NET 项目时遇到此问题,解决方案如下:

转到项目属性并单击构建选项卡并将“生成序列化程序集”下拉列表的值设置为“关闭”。

Sgen.exe 是“XML 序列化程序生成器为指定程序集中的类型创建 XML 序列化程序集,以提高 XmlSerializer 在序列化或反序列化指定类型的对象时的启动性能。” (MSDN)

【讨论】:

可能导致sgen.exe失败的问题可以通过cmd运行sgen.exe来查看(路径:"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools"(替换Win版本.Net 版本系统盘与你的ofc))通过命令[your_path]sgen.exe /assembly:"my-failed-project-build-path/output-name.dll" /verbose【参考方案2】:

有关 sgen.exe 的选项,请参阅 msdn [您有命令行,您可以手动使用它...删除您的 .XmlSerializers.dll 或使用 /force]

今天我也遇到了如何更多manually specify the sgen options。我希望它不使用 /proxy 开关,但它似乎可以让您指定输出目录。我对 msbuild 的了解不足以让它变得很棒,但这应该让你开始[在你选择的非可视化工作室编辑器中打开你的 .csproj/.vbproj,看看底部,你应该能够弄清楚如何/这是哪里]

[为方便起见,以下代码已将 UseProxyTypes 设置为 true]

<Target Name="GenerateSerializationAssembliesForAllTypes"
  DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
  Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
  Outputs="$(OutputPath)$(_SGenDllName)">
    <SGen BuildAssemblyName="$(TargetFileName)"
      BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)"
      ShouldGenerateSerializer="true" UseProxyTypes="true"
      KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)"
      DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
        <Output TaskParameter="SerializationAssembly"
          ItemName="SerializationAssembly" />
     </SGen>
</Target>
<!-- <Target Name="BeforeBuild">
</Target> -->
<Target Name="AfterBuild"
  DependsOnTargets="GenerateSerializationAssembliesForAllTypes">
</Target>

【讨论】:

【参考方案3】:

我还没有看到这个特殊的问题,但最近对我们来说,在安装一些随机且不相关(或者我们认为)的 Windows 后,来自 cl.exe 的“C1001:编译器中发生内部错误”类型崩溃已得到修复安全更新。

我们知道该代码不会使其他使用相同版本和服务包级别的 Visual Studio 的机器上的编译器崩溃,但是当我们尝试 Windows 安全更新时,我们真的是在抓着一根稻草。

【讨论】:

【参考方案4】:

对我来说这看起来很合理,除非有 4096 个字符的限制[你列出 4020 个字符]

4096 限制对我来说似乎有点荒谬,我通过搜索命令行限制找到的东西应该是 2048 或 32767 或 8192。

【讨论】:

【参考方案5】:

当我在 GAC 中的一个网站项目上引用了一个程序集时,我遇到了这个问题,该程序集已被卸载,并且由于某种原因该引用触发了序列化程序集生成,并且 sgen 阻塞了该引用(因为它没有已存在)。删除引用并将序列化程序集生成关闭后,我不再遇到问题。

【讨论】:

以上是关于sgen.exe 在构建期间失败的主要内容,如果未能解决你的问题,请参考以下文章

Android 构建失败:在发布期间

在纱线安装期间构建排毒失败

构建工作,但发布期间的预编译失败

Flutter iOS 构建失败:目标 kernel_snapshot 失败:异常:快照创建期间出错:null 构建失败

在公司网络上构建映像期间网络调用失败

TFVC:在 vnext 构建期间删除工作区失败