2014-01-22 30 views
0

我正在嘗試創建Windows運行時組件以用於Windows 8應用程序。Windows元數據導出程序在編譯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 \ MicroSoft \ 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) 

如果任何人有任何想法是怎麼回事,我怎麼能得到我的組件編譯我會很感激。

James

P.S.我把這個項目轉移到同事的個人電腦上,他們有同樣的問題,所以我懷疑這是否與我的設置有關(Windows 8.1 x64,Visual Studio 2013 Ultimate)。

回答

3

我設法弄清楚了這一點。

看起來像使用string [](或其他數組)作爲IAsyncOperation的泛型類型時存在一個錯誤。

我設法解決這一點,因爲其實我將要返回的IDictionary對象和ILists,其做工精細:

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

希望這將是有用的,以誰比誰過這個怪異的行爲來。