我通过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);
}
如果我错过了解问题的重要事实,请问我
感谢