【问题标题】:Windows Metadata Exporter Crashes when Compiling Windows Runtime Component编译 Windows 运行时组件时 Windows 元数据导出器崩溃
【发布时间】:2014-01-23 01:29:03
【问题描述】:

我正在尝试创建用于 Windows 8 应用程序的 Windows 运行时组件。

这本质上是一个 helloworld 级别的应用程序,因此没有什么复杂的。要复制这个问题,我唯一需要做的就是包含一对方法,如下所示:

public IAsyncOperation<string[]> GetThings()
{
    return GetThingsAsync().AsAsyncOperation();
}
    private async Task<string[]> GetThingsAsync()
{
    return new List<string>().ToArray();
}

每当我编译项目时,Windows 元数据导出器都会崩溃。

我通过增加构建详细程度来挖掘输出窗口中生成的错误,我发现错误发生在“导出 'obj\Debug\HelloWorld.Logic.winmdobj'”之后。

通过尝试使用相同参数从命令行运行 winmdexp.exe,它似乎无法找到 System.Xml 文件的元数据。 (警告 WME0004:找不到引用的元数据 'C:\Program Files(x86)\ReferenceAssemblies\Microoft\Framework.NETCore\v4.5.1\System.Xml.Serialization.dll'。)

错误的完整堆栈跟踪是:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Tools.WinMDExp.AssemblyReferenceExtensionMethods.IsWindowsRuntimeMetadata(IAssemblyReference assembly)
at Microsoft.Tools.WinMDExp.ExportVisitor.IsWindowsRuntimeType(ITypeReference type, Boolean allowGenericParam)
at Microsoft.Tools.WinMDExp.ExportValidator.<>c__DisplayClasse.<GetAlternativeTypes>b__8(<>f__AnonymousType0`2 <>h__TransparentIdentifier5)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection)
at Microsoft.Tools.WinMDExp.ExportValidator.GetAlternativeTypes(ITypeReference parameterType, IMethodDefinition containingMethod, Boolean& isTask, Boolean allowGenericTypeParam)
at Microsoft.Tools.WinMDExp.ExportValidator.GetAlternativesTypesForGenericTypes(IGenericTypeInstanceReference parameterType, IMethodDefinition containingMethod, String& errorMsg)
at Microsoft.Tools.WinMDExp.ExportValidator.CheckAlternateTypes(ITypeReference parameterType, IMethodDefinition containingMethod, Boolean& reportedError)
at Microsoft.Tools.WinMDExp.ExportValidator.ValidateExportParameterType(IMethodDefinition containingMethod, ITypeReference parameterType, Boolean& reportedError)
at Microsoft.Tools.WinMDExp.ExportValidator.ValidateExportMethod(IMethodDefinition method)
at Microsoft.Tools.WinMDExp.ExportValidator.TraverseChildren(IMethodDefinition method)
at Microsoft.Cci.MetadataTraverser.Traverse(IMethodDefinition method)
at Microsoft.Cci.MetadataTraverser.Traverse(IEnumerable`1 methods)
at Microsoft.Cci.MetadataTraverser.TraverseChildren(ITypeDefinition typeDefinition)
at Microsoft.Tools.WinMDExp.ExportValidator.TraverseChildren(ITypeDefinition typeDefinition)
at Microsoft.Cci.MetadataTraverser.TraverseChildren(INamedTypeDefinition namedTypeDefinition)
at Microsoft.Tools.WinMDExp.ExportValidator.TraverseChildren(INamespaceTypeDefinition namespaceTypeDefinition)
at Microsoft.Cci.MetadataTraverser.Traverse(INamespaceTypeDefinition namespaceTypeDefinition)
at Microsoft.Cci.MetadataTraverser.Dispatcher.Visit(INamespaceTypeDefinition namespaceTypeDefinition)
at Microsoft.Cci.MetadataReader.ObjectModelImplementation.NamespaceType.Dispatch(IMetadataVisitor visitor)
at Microsoft.Tools.WinMDExp.ExportValidator.Validate(ITypeDefinition type)
at Microsoft.Tools.WinMDExp.ExportValidator.TraverseChildren(IModule module)
at Microsoft.Cci.MetadataTraverser.TraverseChildren(IAssembly assembly)
at Microsoft.Tools.WinMDExp.ExportValidator.TraverseChildren(IAssembly assembly)
at Microsoft.Cci.MetadataTraverser.Traverse(IAssembly assembly)
at Microsoft.Tools.WinMDExp.ExportVisitor.Export(IAssembly assembly)
at Microsoft.Tools.WinMDExp.Exporter.Export()
at Microsoft.Tools.WinMDExp.Program.Main(String[] args)

如果有人知道发生了什么以及如何编译我的组件,我将不胜感激。

詹姆斯

附:我将项目转移到同事的电脑上,他们也遇到了同样的问题,所以我怀疑这是否与我的设置有关(Windows 8.1 x64、Visual Studio 2013 Ultimate)。

【问题讨论】:

    标签: windows-runtime visual-studio-2013 windows-8.1


    【解决方案1】:

    我自己设法解决了这个问题。

    使用 string[](或其他数组)作为 IAsyncOperation 的泛型类型时似乎存在错误。

    我已经设法解决了这个问题,因为实际上我想要返回 IDictionary 对象和 IList,它们可以正常工作:

    /* //Won't Work - crashes Windows Metadata Exporter
    public IAsyncOperation<string[]> GetThings()
    {
        return GetThingsAsync().AsAsyncOperation();
    }
    private async Task<string[]> GetThingsAsync()
    {
        return new [] {"I am a string"};
    }
    */
    
    //This Works
    public IAsyncOperation<IList<string>> GetThingsList()
    {
        return GetThingsListAsync().AsAsyncOperation();
    }
    private async Task<IList<string>> GetThingsListAsync()
    {
        return new[] { "I am a string" };
    }
    

    希望这对遇到这种奇怪行为的其他人有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多