在.NET 4.0之前的某些场景中,检索ITypeInfo的类型失败,并出现TypeLoadException

在.NET 4.0之前的某些场景中,检索ITypeInfo的类型失败,并出现TypeLoadException,.net,com-interop,.net,Com Interop,我正在编写一些代码,这些代码在不使用COM互操作程序集的情况下探索COM对象。有一次,我尝试迭代IDispatch实例的ITypeInfos(省略了参考清理/发布): var dispatch=实例作为IDispatch; if(分派!=null) { 单位计数; dispatch.GetTypeInfoCount(超出计数); 对于(uint i=0;i

我正在编写一些代码,这些代码在不使用COM互操作程序集的情况下探索COM对象。有一次,我尝试迭代
IDispatch
实例的ITypeInfos(省略了参考清理/发布):

var dispatch=实例作为IDispatch;
if(分派!=null)
{
单位计数;
dispatch.GetTypeInfoCount(超出计数);
对于(uint i=0;i
但对于某些COM实例,调用
Marshal.getTypeForitTypeInfo
总是失败,出现
TypeLoadException
,例如:

System.TypeLoadException:无法从程序集“SOCOMApplicationLib,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”加载类型“SOCOMApplicationLib.IAApplication”

对我来说,谜团是:这个错误只发生在.NET4.0之前

有没有人对这种行为有什么解释,暗示我去哪里看得更透彻,还是我忘了考虑什么因素?
更新:我改变了策略:不再尝试使用
封送.getTypeForitTypeInfo
封送.GetMethodInfoForComSlot
来检索可用方法的名称,而是使用
类型属性
functdesc
结构。但是,我很好奇为什么我最初的方法不能可靠地工作。

问题似乎是一个普通类型的负载异常,您可以通过fusion日志进行调试/诊断。我想我检查了fusion日志,但我不是100%确定,所以我会(再次)检查它尽快。问题似乎是普通类型的加载异常,您可以通过fusion日志进行调试/诊断。我想我检查了fusion日志,但我不是100%确定,所以我会尽快(再次)检查它。
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
    }
}