我正在研究一些不使用COM互操作程序集来探索COM对象的代码。有一次,我尝试迭代IDispatch
实例的ITypeInfos(省略了参考清理/发布):
var dispatch = instance as IDispatch;
if (dispatch != null)
{
uint count;
dispatch.GetTypeInfoCount(out count);
for (uint i = 0; i < count; i++)
{
IntPtr ptrTypeInfo;
dispatch.GetTypeInfo(i, 0, out ptrTypeInfo);
var itype = Marshal.GetTypeForITypeInfo(ptrTypeInfo); // fails here
}
}
但是对于某些COM实例,对Marshal.GetTypeForITypeInfo
的调用总是失败并带有TypeLoadException
,例如:
System.TypeLoadException:无法从程序集“SOCOMApplicationLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”加载类型“SOCOMApplicationLib.IApplication”。
我的疑问是:此错误仅发生在.NET 4.0之前。
有没有人对这种行为有解释,暗示哪里看得更彻底或者我忘记考虑的因素?
更新:我更改了策略:不是尝试将Marshal.GetTypeForITypeInfo
与Marshal.GetMethodInfoForComSlot
一起使用,以便检索我现在使用{{TYPEATTR
的可用方法的名称1}}和FUNCDESC
结构。但是,我很好奇为什么我的原始方法无法可靠地工作。