无法在发布模式下构建 UWP

Posted

技术标签:

【中文标题】无法在发布模式下构建 UWP【英文标题】:Can't build UWP in release mode 【发布时间】:2016-06-07 13:17:20 【问题描述】:

我有一个项目在调试模式下运行良好,但在发布模式下根本无法运行。

解决方案包含 3 个项目

共享项目

windows phone 8.1 项目

UWP 项目

这是错误输出

 2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error : System.InvalidOperationException: Unable to generate a temporary class (result=1).
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error : error CS0012: The type 'Windows.UI.Xaml.Visibility' is defined in an assembly that is not referenced. You must add a reference to assembly 'Windows.Foundation.UniversalApiContract, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime'.
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error : error CS0030: Cannot convert type 'Windows.UI.Xaml.Visibility' to 'Windows.UI.Xaml.Visibility [e:\MyApp\obj\x86\Release\ilc\in\WinMetadata\Windows.winmd]'
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error : error CS0029: Cannot implicitly convert type 'Windows.UI.Xaml.Visibility [e:\MyApp\obj\x86\Release\ilc\in\WinMetadata\Windows.winmd]' to 'Windows.UI.Xaml.Visibility'
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error : 
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error :    at System.Xml.Serialization.Compiler.Compile(String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence, String outputDir, String intermediateDir, Boolean loadAssembly)
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error :    at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Hashtable assemblies, String outputDir, String intermediateDir, Boolean loadAssembly)
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error :    at System.Xml.Serialization.XmlSerializer.GenerateSerializer(Type[] types, XmlMapping[] mappings, CompilerParameters parameters, String outputDir, String intermediateDir, Boolean loadAssembly)
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error :    at System.Xml.Serialization.XmlSerializer.GenerateSerializer(Type[] types, String outputDir, String intermediateDir, List`1 wcfSerializers, Boolean loadAssembly)
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error :    at SerializationAssemblyGenerator.Program.Main(String[] args)
2>C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\IlcInternals.targets(887,5): error : Internal compiler error: One or more errors occurred.

我使用的 nuget 包是

    "GoogleAnalyticsSDK": "1.2.12",
    "HockeySDK.UWP": "4.0.0",
    "htmlAgilityPack": "1.4.9",
    "Microsoft.ApplicationInsights": "1.0.0",
    "Microsoft.ApplicationInsights.PersistenceChannel": "1.0.0",
    "Microsoft.ApplicationInsights.WindowsApps": "1.0.0",
    "Microsoft.NETCore.UniversalWindowsPlatform": "5.1.0",
    "MvvmLightLibs": "5.1.1",
    "Newtonsoft.Json": "8.0.3",
    "WriteableBitmapEx": "1.5.0"

更新

我尝试手动添加 Windows.Foundation.UniversalApiContract,但得到了这个

更新 2

在我取消选中 Compile with .Net Native 工具链功能后,它就起作用了。

有什么方法可以使用 .net 原生工具链来构建它?

【问题讨论】:

“您必须添加对程序集 'Windows.Foundation.UniversalApiContract, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime'的引用” -似乎相关。 不,这应该是自动添加的,请检查更新的问题。 您不能相信在第一次严重事故之后收到的错误消息。对 .NET Native 编译器进行故障排除远远超出了您的问题范围,它需要有权访问您的代码并且对编译器有足够了解的人才能找到该编译器中的错误或建议您的代码中的解决方法。您只能在 Microsoft 支持部门找到该人员。 解决了 .NET Native 的一些问题,并且是 Visual Studio 2015 Update 2 的一部分。您能否确认您是否安装了最新的 VS 更新?您也可以通过 dotnetnative@microsoft.com 直接与团队联系,我们很乐意提供帮助(因为我们很可能无法通过这些步骤重现问题)。 是的,我已经安装了最新的 VS 更新。 【参考方案1】:

我也遇到了一个非常相似的问题。我有一个类型,比如说 Foo,它引用了一个 winmd 类型 Windows.UI.Xaml.Visibility,见下文。

    public class Foo
    
        public Windows.UI.Xaml.Visibility Visibility;
    

当我尝试使用 XmlSerializer 序列化 Foo 类型的实例时,我在编译时遇到了完全相同的错误。似乎 .Net Native 工具在为 Foo 等类型生成 XmlSerializer 方面存在问题。

这是我的解决方法。我创建了自己的 Visibility 类型 MyVisibility,并将现有的 Visibility 字段更改为 get only 属性(这样 XmlSerializer 就不会序列化该属性)。

    public class Foo
    
        public Windows.UI.Xaml.Visibility Visibility
        
            get
            
                return (Visibility)myVisibility;
            
        

        public MyVisibility myVisibility;
    

    public enum MyVisibility
    
        Visible = 0,
        Collapsed = 1
    

这是我序列化 Foo 实例的测试代码,

    public static void Test()
    
        var foo = new Foo();
        foo.myVisibility = MyVisibility.Collapsed;            
        var serializer = new XmlSerializer(typeof(Foo));
        using (var stream = new MemoryStream())
        
            serializer.Serialize(stream, foo);
            stream.Position = 0;
            var foo1 = (Foo)serializer.Deserialize(stream);
            Assert.True(foo.Visibility == foo1.Visibility);
        
    

希望这会有所帮助。

【讨论】:

以上是关于无法在发布模式下构建 UWP的主要内容,如果未能解决你的问题,请参考以下文章

我无法构建 Zebble 生成的 UWP 项目

UWP Cordova - 创建 appxupload 构建后无法运行应用程序

VS2017 无法构建 UWP Store 包(.NET Native,ARM 构建中的错误)

在发布模式下构建后 Flutter Secure Storage 无法正常工作

无法在发布模式下构建我的项目!请帮助我

在开发模式下无法在 Xbox One 上登录我的应用沙盒