locked
Windows Metadata Exporter Crashes RRS feed

  • Question

  • hi,

    I'm attempting to create a Windows Runtime Component for use in a Windows 8 app.

    This is essentially a helloworld level application and so has nothing complex.  The only thing that I need to do to replicate the issue is to include a pair of methods such as the following:

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

    Whenever I compile the project, the Windows Metadata Exporter crashes.

    I've dug into the errors generated in the output window by increasing the build verbosity and I've found that the error occurs after "Exporting 'obj\Debug\HelloWorld.Logic.winmdobj'."

    By attempting to run winmdexp.exe from command line with the same parameters, it seems that it's having trouble finding metadata for the System.Xml files. (warning WME0004 : Could not find referenced metadata 'C:\Program Files(x86)\ReferenceAssemblies\Microoft\Framework\.NETCore\v4.5.1\System.Xml.Serialization.dll'.)

    The full stack trace of the error is:

    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)

    If anyone has any idea what's going on and how I can get my component compiling I'd be grateful.

    James

    P.S. I transferred the project to a colleague's PC and they had the same issue so I doubt if it's anything to do with my setup (Windows 8.1 x64, Visual Studio 2013 Ultimate).

    Tuesday, January 21, 2014 2:41 PM

Answers

  • I've managed to figure this out myself.

    It seems as though there is a bug when using string[] (or other arrays) as the generic type for IAsyncOperation.

    I have managed to work around this because actually I will want to return IDictionary objects and ILists, which work fine:

    /* //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" };
    }

    Hopefully this will be of use to anyone else who comes across this weird behaviour.

    • Marked as answer by JWilson 360 Wednesday, January 22, 2014 12:52 PM
    Wednesday, January 22, 2014 12:49 PM