搞来搞去,离夜深越来越近,我们不犯困,却有点更加迷惑了,不make sense呀!
那笨人有笨招,细化问题吧!
实验一:
我把COM组件的工程单独领出来,修改工程的属性,启用编译后自动注册开关,编译成功,看注册表应该注册成功;在创建一个新的工程来调用COM组件:
1: Type comType = Type.GetTypeFromProgID("COM ProgID"); 2: object comObj = System.Activator.CreateInstance(comType); 3: Type[] t = comType.GetInterfaces(); 4: 5: object x=comType.InvokeMember("MethodName", BindingFlags.InvokeMethod, null, comObj, new object[3] { null,null,null}); 6: MethodInfo[] method = comType.GetMethods(); 7: if (method != null) 8: { 9: 10: } |
执行程序,在第2出错,和之前的安装程序的错误日制一致。(COM异常就不说了,不影响理解问题)
这个实验只能在此证明问题还没有解决,不在那里,就在这里
紧接着:
实验二:
我把COM组件中的具体实现代码全部注释掉,如果函数需要返回值,就仅仅返回一个fake的值,这样我的COM近似等于一个空壳,不依赖于任何第三方,编译,注册成功,在用上面的代码创建COM对象的实例。
实验结果:成功!
这是一大进步,通过实验二可以大胆确定问题出在COM对象的实现代码里,那究竟是哪一块代码呢,很明显,应该是类的构造函数里,这意味着COM对象在构造的时候抛出未捕获异常,导致最终显示给我们的那段错误日志信息!
这时候,再去review构造函数,发现构造函数是有try catch的,只不过。。只不过。。构造函数的第一行没有包含在try catch block里,这一行只不过是打印了一条调试日志而已啊,真不敢相信这就是元凶,这行代码like:
utilDebug.Log(.....)
我相信你不是无辜的。
现在,再来看看这个utilDebug到底是啥玩意: