我能够在适用于 Android 和 iOS 的最新版本 VS2017 (15.9.2) 上在 Windows 中构建应用程序,并且能够使用远程 iOS 模拟器运行我在 Mac 上构建的 iOS 应用程序。但是,当我在 Visual Studio for Mac 的 High Sierra 上的 2009 iMac 上使用相同的解决方案时,当 msbuild 尝试生成序列化程序集时,我的 sgen.exe 中的一个 .NET 标准库出现异常:
Unhandled Exception:
System.TypeLoadException: Could not load type of field '<TYPENAME>+<>c__DisplayClass3_0:obj' (0) due to: Could not load file or assembly 'Newtonsoft.Json,
Version=12.0.0.0,
Culture=neutral,
PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.
为了解决这个问题,我注释掉了失败的类(在上述异常中的 cs 内)以及该文件中与 Newtonsoft.Json 相关的 using 语句。这样做之后,我得到以下异常:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
at System.Xml.Serialization.XmlSerializationWriterCodeGen.FindXmlnsIndex (System.Xml.Serialization.MemberMapping[] members) [0x00014] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationWriterCodeGen.WriteStructMethod (System.Xml.Serialization.StructMapping mapping) [0x00359] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationWriterCodeGen.GenerateMethod (System.Xml.Serialization.TypeMapping mapping) [0x00024] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationCodeGen.GenerateReferencedMethods () [0x0001b] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationWriterCodeGen.GenerateEnd () [0x00000] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.TempAssembly.GenerateAssembly (System.Xml.Serialization.XmlMapping[] xmlMappings, System.Type[] types, System.String defaultNamespace, System.Security.Policy.Evidence evidence, System.Xml.Serialization.XmlSerializerCompilerParameters parameters, System.Reflection.Assembly assembly, System.Collections.Hashtable assemblies) [0x003a7] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializer.GenerateSerializer (System.Type[] types, System.Xml.Serialization.XmlMapping[] mappings, System.CodeDom.Compiler.CompilerParameters parameters) [0x000cb] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at Driver.Run (System.String[] args) [0x0042c] in <4ef54e9b09fa46d8995a283d81fa42c0>:0
at Driver.Main (System.String[] args) [0x00005] in <4ef54e9b09fa46d8995a283d81fa42c0>:0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
at System.Xml.Serialization.XmlSerializationWriterCodeGen.FindXmlnsIndex (System.Xml.Serialization.MemberMapping[] members) [0x00014] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationWriterCodeGen.WriteStructMethod (System.Xml.Serialization.StructMapping mapping) [0x00359] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationWriterCodeGen.GenerateMethod (System.Xml.Serialization.TypeMapping mapping) [0x00024] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationCodeGen.GenerateReferencedMethods () [0x0001b] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializationWriterCodeGen.GenerateEnd () [0x00000] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.TempAssembly.GenerateAssembly (System.Xml.Serialization.XmlMapping[] xmlMappings, System.Type[] types, System.String defaultNamespace, System.Security.Policy.Evidence evidence, System.Xml.Serialization.XmlSerializerCompilerParameters parameters, System.Reflection.Assembly assembly, System.Collections.Hashtable assemblies) [0x003a7] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at System.Xml.Serialization.XmlSerializer.GenerateSerializer (System.Type[] types, System.Xml.Serialization.XmlMapping[] mappings, System.CodeDom.Compiler.CompilerParameters parameters) [0x000cb] in <9e212f4dac634c83bb98a320d2c5ec4d>:0
at Driver.Run (System.String[] args) [0x0042c] in <4ef54e9b09fa46d8995a283d81fa42c0>:0
at Driver.Main (System.String[] args) [0x00005] in <4ef54e9b09fa46d8995a283d81fa42c0>:0 /Library/Frameworks/Mono.framework/Versions/5.16.0/lib/mono/msbuild/15.0/bin/Microsoft.Common.CurrentVersion.targets(3553, 5): error MSB6006: "sgen.exe" exited with code 1. Done building target "GenerateSerializationAssemblies" in project "<PROJECTNAME>.csproj" -- FAILED.
我还尝试了以下方法:
- 将链接器行为从任何东西更改为根本不链接到链接所有内容。没有区别。
- 在项目设置中将“生成序列化程序集”设置为“关闭”。该应用程序内置于 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 上却不行。在此先感谢您的帮助!