问题标签 [sgen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3238 浏览

c# - XmlSerializer - 第一次反序列化很慢

我有两个项目的解决方案;一个 asp.net MVC 应用程序和一个类库。我们称它们为项目 MVC 和项目 CLS。

在 CLS 项目中,有两个不同版本的 XSD 文件(V1 和 V2),我使用xsd2code创建了两个同名但在不同命名空间(V1 和 V2)下的可序列化类。

在 MVC 项目中,当用户上传一个 XML 文件时,CLS.dll用于将 XML 反序列化为一个对象。当XML文件是V1类型时,反序列化非常快,但是V2版本的XSD文件要复杂很多,反序列化可能需要几分钟,只有第一次(之后非常快) ,直到应用程序再次运行)。

我使用Sgen.exe工具CLS.XmlSerializers.dll为 CLS.V2 类型创建了一个序列化程序程序集 ( ),以消除第一次即时创建程序集,从而提高性能。

我已经成功地将 Sgen 任务添加到 Post Build 事件中,并且CLS.XmlSerializers.dll每次构建项目时都会创建程序集。此外,我在这篇文章中使用了单元测试代码来确保程序集已加载,并且确实如此。测试成功通过。

但是,第一次反序列化 XML 文件仍然需要很长时间。所以,还是应该有问题。但是,我不知道是什么。请帮忙。

更新:

Fuslogvw.exe按照评论中的建议使用了,我可以看到CLS.XmlSerializers.dll正在成功加载。那么,为什么第一次反序列化 XML 文件大约需要一分钟,但之后每次都不到一秒?

更新 2:

两个 XSD 文件之间的区别之一是第二个 (V2) 引用了一个非常大的 XSD 文件,该文件包含xs:enumeration在主文件中使用的某些类型的定义。而且,这就是反序列化需要很长时间的原因。由于我需要做的就是将 XML 文件反序列化为对象,并且不需要针对这些枚举验证属性和元素的值,因此我最终删除了对该 XSD 文件的引用,并将所有枚举类型替换为它们的基本类型(在本例中为xs:string)。现在,V2 的反序列化速度和 V1 一样快,我什至不需要使用Sgen.exe. 我想Sgen.exe只有在需要反序列化非常大的 XML 文件的情况下才有帮助。在我的例子中,XML 文件总是非常小,但是反序列化是(曾经)复杂的。

0 投票
1 回答
1560 浏览

visual-studio - Visual Studio 不允许编译“Sgen 无法运行”

得到错误:

和警告:

在 Microsoft.Common.CurrentVersion.targets 的这一部分:

解释很简单,但我不明白如何解决它。如何减少命令行长度?

0 投票
2 回答
339 浏览

c# - MSBuild 由于 sgen.exe 错误而失败

我不知道从哪里开始。我的构建在发布模式下失败。错误信息是:

SGEN:错误:来自程序集“Api,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的“Api.Attributes.ModuleAuthorizeAttribute”类型中的方法“ExecuteAuthorizationFilterAsync”没有实现。

它显然有一个实现,它一直构建到sgen任务。(并且在调试模式下它完全构建,因为没有sgen。)

虽然我可以像这里一样更改构建选项,但我宁愿找到问题的根源,而不是禁用优化。

还尝试制作一个小应用程序来重现该问题但失败了,并且上传此应用程序不是一种选择。这是巨大的,不是我的分享。

0 投票
1 回答
760 浏览

.net - 关于 VSTS 上格式不正确的程序集的 SGEN 错误

我有一个具有以下(简化)结构的解决方案:

这两个项目都针对 .NET Framework 4.5.2。它在本地和 VSTS 中构建。

我现在在 DAL 项目中添加了一个 NuGet 包引用到一个 .NET Standard 1.1 dll。它仍然在我的本地机器上完美构建,但不再在 VSTS 上。我收到以下错误:

请注意 VSTS 似乎在抱怨Business.csproj而不是DAL.vbproj. 尽管 Business 确实引用了 DAL。

我已经阅读了 .NET Standard 1.1 不支持 SGEN,但是如果生成序列化程序集的选项设置为Auto,它应该可以工作。我所有的项目都设置为自动。

我还阅读了有关如何更改构建定义的信息,但是

  • 我无法更改构建定义
  • 我在本地使用相同的配置没有错误(Release,Any CPU)

我应该研究.NET Core Xml Serializer Generator吗?理想情况下,我只想让我的 NuGet 包的构建跳过 SGEN。

更新

将该system.debug选项设置为 true 可以为我们提供更多信息。我们有一条错误消息:cannot load a reference assembly for execution。我们还能够在本地复制它。我的机器安装了 .NET 4.7.1 SDK 和目标包,但另一台本地机器没有。安装它修复它。我们现在正在考虑在构建机器上安装它(显然,VSTS 被设置为在本地代理上使用)。

我相信这些是相关的日志行:

```

0 投票
1 回答
1974 浏览

.net - 在发布构建期间找不到 CefSharp.Core.dll

我们有一个 .net 4.6.2 项目,它在 AnyCPU 上以“首选 32 位”的形式分发,并且正在使用 CefSharp,其软件包同时具有 x86 和 x64 版本。

按照 CefSharp 项目中添加 AnyCPU 支持的建议(选项 1),我执行了以下操作:

  1. 在我的 .csproj 文件中的第一个添加了 true
  2. 在我的 app.config 文件中添加了以下内容:
  1. 如前所述,我所有的项目配置都设置为“首选 32 位”
  2. 在启动时初始化 Cef:

在调试中一切正常,但是当我尝试构建我的发布版本时,我得到一个错误 - 使用详细模式:

2>SGEN:错误:无法加载文件或程序集“CefSharp.Core.dll”或其依赖项之一。指定的模块无法找到。

再往上,我可以看到它传递了以下对 SGEN 的引用:

2> 参考= 2>C:\SVN\MySolution\Branches\MyBranch\packages\CefSharp.Common.63.0.2\build..\CefSharp\x86\CefSharp.Core.dll 2>C:\SVN\MySolution\Branches \MyBranch\packages\CefSharp.Common.63.0.2\build..\CefSharp\x86\CefSharp.dll 2>C:\SVN\MySolution\Branches\MyBranch\packages\CefSharp.WinForms.63.0.2\build.. \CefSharp\x86\CefSharp.WinForms.dll

这似乎来自 CefSharp.Common.props 文件:

或 CefSharp.Common.targets 文件:

如果它是文件名的“build..”部分没有被 SGEN 解析,我尝试硬编码“$(MSBuildThisFileDirectory)..”(我不想真正这样做的原因有很多;但这是一个测试)但遇到了完全相同的问题,但正确的绝对路径作为对 SGEN 的引用传入:

2> 参考= 2>C:\SVN\MySolution\Branches\MyBranch\packages\CefSharp.Common.63.0.2\CefSharp\x86\CefSharp.Core.dll 2>C:\SVN\MySolution\Branches\MyBranch\packages \CefSharp.Common.63.0.2\CefSharp\x86\CefSharp.dll 2>C:\SVN\MySolution\Branches\MyBranch\packages\CefSharp.WinForms.63.0.2\CefSharp\x86\CefSharp.WinForms.dll

这给我留下了为什么 SGEN 无法加载 dll 的问题。所以,我目前的想法是,这是由于缺少依赖。我应该期待这个参考列表中的 libcef.dll 吗?我已将其他软件包添加到我的 .csproj 文件中:

我还尝试注释掉上面的第二个/x64 导入行,但无济于事。

[更新] 我刚刚打开了 Fusion 日志记录(根据 Yavor Georgiev 关于 SGEN 错误的博客文章),据此 dll 加载正常。

0 投票
2 回答
2179 浏览

c# - sgen.exe 的命令行太长

我有一个包含很多 nuget 包的 .net 4.5 项目,我将其升级到 4.7.2。为了解决包的一些特定更新问题(如) requireReinstallation="true"packages.config我升级了相关包。现在我已经升级了软件包和一些新的软件包,比如

目前,我可以构建它,但是当我尝试使用Generate serialization assembly选项来构建它时,我在 teamcity (和本地)中遇到了一个错误,例如

当然我可以禁用Generate serialization assembly,但我不想要。我认为命令行中参数过多的问题。在我升级项目后,依赖的总数达到了限制。

我该如何解决这个问题?breaking down the call to "SGen" into multiple calls with fewer parameters per call(如何?)或其他

0 投票
0 回答
102 浏览

xamarin - Xamarin 应用程序基于 VS2017 而不是 VS for Mac 构建

我能够在适用于 Android 和 iOS 的最新版本 VS2017 (15.9.2) 上在 Windows 中构建应用程序,并且能够使用远程 iOS 模拟器运行我在 Mac 上构建的 iOS 应用程序。但是,当我在 Visual Studio for Mac 的 High Sierra 上的 2009 iMac 上使用相同的解决方案时,当 msbuild 尝试生成序列化程序集时,我的 sgen.exe 中的一个 .NET 标准库出现异常:

为了解决这个问题,我注释掉了失败的类(在上述异常中的 cs 内)以及该文件中与 Newtonsoft.Json 相关的 using 语句。这样做之后,我得到以下异常:

我还尝试了以下方法:

  • 将链接器行为从任何东西更改为根本不链接到链接所有内容。没有区别。
  • 在项目设置中将“生成序列化程序集”设置为“关闭”。该应用程序内置于 Windows,但在加载时崩溃。在 Visual Studio for Mac 中似乎没有控制此选项的选项。
  • 将所有 PCL 项目更改为 .NET Standard 2.0 项目并将所有 Xamarin Droid 或 iOS 项目更改为使用 PackageReferences 而不是 package.config
  • 将最新版本的 Newtonsoft.Json 添加到解决方案中的所有项目
  • 将 Mono、Xamarin 和 VS for Mac 更新到最新版本

有人有什么想法吗?同样,iOS 和 Android 版本似乎都可以在 Windows 上的 Visual Studio 2017 中运行,但在我的 Mac 上却不行。在此先感谢您的帮助!

0 投票
1 回答
84 浏览

build - 为什么在发布模式下构建失败?

我在 VS2017 中有一个 C# MVC Web 应用程序,它引用了两个库项目 Crd.Core 和 Crd.Data。这两个库都引用了我存储在解决方案级别文件夹中的相同第三方 dll。在调试中一切正常。在 Release Crd.Core 中构建正常,但 Crd.Data 失败并出现两个错误:

这个程序集肯定被引用了。两个项目从相同的中性位置引用完全相同的文件。我尝试移动引用的文件,并在重新添加它们之前删除引用。

两个项目的以下内容相同:

  • 配置(任何 CPU)
  • 目标框架(4.6.1)
  • csproj 文件中的 PropertyGroups
  • csproj 文件中对第三方 DLL 的引用
  • 引用的属性(相同的版本,Copy Local = True 等)

基本上我的两个项目在我能想到的检查的各个方面都是相同的,但其中一个项目无法在发布模式下构建,所以某处肯定有一些不同的地方。我错过了什么?我还能检查什么?

0 投票
1 回答
231 浏览

c# - 如何使用 SGen 为映射到两级数组的 XML 模式生成序列化程序集?

我正在使用需要 XmlSerializerFormat 合同的第三方服务;我想通过创建序列化程序集来加快启动速度,但 Sgen.exe 确实不喜欢 Xsd.exe 为其吐出嵌套数组的架构中的特定构造。

该模式包括嵌套两层深度的元素序列,如下所示:

Foo.xsd

即:一个顶层Foo包含许多FooLists,而aFooList包含许多FooListItem

运行xsd /c Foo.xsd产生以下结果:

Foo.cs

也就是说,FooList由于某种原因,没有类 for 存在,而是只有一个嵌套的FooListItems 数组。

但是,当我使用 just 构建它并在生成的 DLL 上运行 Sgen.exe 时,sgen /keep obj\Debug\net461\Foo.dll会出现以下错误消息:

错误 CS0030:无法将类型“FooListItem[]”转换为“FooListItem”
错误 CS0029:无法将类型“FooListItem”隐式转换为“FooListItem[]”

(我使用的是 .NET 4.7 版本的 Xsd.exe 和 Sgen.exe,我只是针对 4.6.1 的兼容性。)

查看生成的代码,它被以下方法阻塞:

因此,似乎 Xsd.exe 和 Sgen.exe 试图实现元素具有包含 X 项的显式“X 列表”子元素的模式,而无需为列表元素创建单独的类,而仅依赖于序列化的名称合成中间元素的属性;当列表元素本身可能重复时,这会中断。

有没有办法解决这个问题?像强制 Xsd.exe 为中间元素生成一个类?我想这可能是 Xsd.exe 和 Sgen.exe 中的一个实际错误,但这在合理的时间范围内不会真正帮助我。


如上所述,这是第三方服务;我完全无法控制架构,并且生成代码的手动编辑越少越好,因为我的实际文件有数万行长。

0 投票
0 回答
252 浏览

c# - 使用 SGEN 生成序列化程序 - 关于缺少 netstandard 引用事件的错误,但它被引用

我正在尝试针对其中一个 dll 运行 SGEN。我收到错误:

“错误 CS0012:'System.Object' 类型在未引用的程序集中定义。您必须添加对程序集 'netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51'的引用。”。

但是在csproj中已经引用了匹配版本的netstandard dll,并且也作为命令参数传递。Dll 是“.NET Framework 4.7.2”。相同的命令适用于解决方案中的其他一些 dll。

可能是什么原因造成的?