编译Windows运行时组件时,Windows元数据导出程序崩溃

时间:2014-01-22 08:45:12

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

我正在尝试创建一个Windows运行时组件,以便在Windows 8应用程序中使用。

这实际上是一个helloworld级别的应用程序,所以没有什么复杂的。我需要做的唯一复制问题的方法是包括一对方法,如下所示:

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

每当我编译项目时,Windows Metadata Exporter都会崩溃。

我通过增加构建详细程度挖掘了输出窗口中生成的错误,并且我发现在“导出'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)

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

詹姆斯

P.S。我将项目转移到同事的PC上,他们遇到了同样的问题,所以我怀疑这与我的设置有什么关系(Windows 8.1 x64,Visual Studio 2013 Ultimate)。

1 个答案:

答案 0 :(得分:3)

我已经成功解决了这个问题。

使用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" };
}

希望这对任何遇到这种奇怪行为的人都有用。