搞来搞去,离夜深越来越近,我们不犯困,却有点更加迷惑了,不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到底是啥玩意: