GetEnumerator在Windows上使用WinRT抛出ArgumentException

时间:2017-02-22 14:37:05

标签: .net com windows-runtime marshalling ienumerable

我通过com对象获取xmlCollection,并尝试将foreach与获取的集合一起使用。这会调用此

System.ArgumentException at System.Runtime.InteropServices.Marshal.GetComObjectData(Object obj, Object key) at System.Runtime.InteropServices.CustomMarshalers.EnumerableToDispatchMarshaler.MarshalNativeToManaged(IntPtr pNativeData) at System.Collections.IEnumerable.GetEnumerator() Message: The object's type must not be a Windows Runtime type.

代码在逻辑GetEnumerator()内Marshal.GetComObejectData失败。我想这是因为系统混合了Com和winRt对象,但是却误解了如何解决问题。

我想注意windows 10中获取和转换的集合类型为Windows.Data.Xml.Dom.XmlNodeList。这是winRt类型

最重要的是,问题仅存在于WinRT的Windows上(win 8,10,2012)。在Windows 7上一切都很好。

这里用于将com对象转换为托管代码的接口。 this[index]Count效果很好,我可以诉诸这些但GetEnumerator失败

[TypeLibType(TypeLibTypeFlags.FDispatchable)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface INewList:IEnumerable
{

  [DispId(0)]
  IXMLDOMNode this[int index]
  {
    [return: MarshalAs(UnmanagedType.Interface)]
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0)]
    get;
  }


  [DispId(0x4a)]
  int Count
  {
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x4a)]
    get;
  }
}

这是我用来获取集合的界面

[ComImport, Guid("1933BF91-7B36-11D2-B20E-00104F983E60"), TypeLibType((short) 0x10c0)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IDom
{
   [return: MarshalAs(UnmanagedType.Interface)]
   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x1d)]
   INodeList SelectNodes([In, MarshalAs(UnmanagedType.BStr)] string queryString);
}

如果我错过了解问题的重要事实,请问我

感谢

0 个答案:

没有答案