如题,我想用C#调用一个标准COM组件(Microsoft Office Document Imageing)。
一般的方法是通过VS的工程-->引用-->添加引用;来调用一个COM组件,可是如果这样调用的话就会多出一个像Interop.***.dll这样的“尾巴”来。感觉很讨厌。请问,如何调用一个COM组件,而不要生成那个讨厌的“尾巴”。1,我曾试过,将Interop.***.dll代码反编译后加到我的工程中,可是反编译后的代码很多都有语法错误(Xenocode和Reflector都是如此)。
2,我曾试过,用反射调用COM组件,一般的方法调用还可以,可是我调用的这个组件的这个类有一个属性。用反射死活调用不到这个属性。以下是方法2的代码:m_Com_Document = Type.GetTypeFromCLSID(new Guid("40942A6C-1520-4132-BDF8-BDC1F71F547B"), false);//Document Object
m_Com_Document.InvokeMember("Create", BindingFlags.InvokeMethod, null, objDoc, new object[] { fileOpen });
m_Com_Document.InvokeMember("OCR", BindingFlags.InvokeMethod, null, objDoc, new object[] { ocrLanuage, true, true });
//下面这句返回NULL,如果上面的OCR没有异常,Images属性肯定不应该为NULL的
PropertyInfo piImages = m_Com_Document.GetProperty("Images", BindingFlags.GetProperty);
请问各位大大,我该如何解决呀,什么方法都可以,只要没有那个讨厌的“尾巴”就行。

解决方案 »

  1.   

    继续,“我曾想过”!
    3,我曾想过,把Interop.***.dll包含进程序集,然后EXE运行后从资源里获取程序集反射调用相应的方法。这种方法我感觉很“菜”所以不到万不得已我暂时不考虑。
    4,我曾想过,用C++的调用方式方法,可是。哎。不行。。
    5,我曾想过,,,,哎,想的多了,就是想不出解决办法。。
      

  2.   

    不好意思,上面的这句写错了。
    //下面这句返回NULL,如果上面的OCR没有异常,Images属性肯定不应该为NULL的
    PropertyInfo piImages = m_Com_Document.GetProperty("Images", BindingFlags.GetProperty);应该改为
    object objImages = m_Com_Document.InvokeMember("Images", BindingFlags.GetProperty, null, objDoc, null);
    这样就可以得到这个属性的结果了。。
    但是这个结果是一个COM类的数组,我怎么能得到它的值呢?
      

  3.   

    楼主对反射理解的有问题。
    1.m_Com_Document.InvokeMember("Create", BindingFlags.InvokeMethod, null, objDoc, new object[] { fileOpen });
    =>你既然说是“属性”,怎么能用BindingFlags.InvokeMethod?应该是Get/SetProperty
    2.PropertyInfo piImages = m_Com_Document.GetProperty("Images", BindingFlags.GetProperty); 
    =>你对这个参数存在重大误区,你想:你已经调用了GetProerty方法,还需要在BindingFlags上指定吗?这个BindingFlags是用来指定访问权限和是否静态的
    3.很遗憾的是,对COM的反射能力有限,你只能调用某个成员,而不能检索某个成员,就是说,你只能用InvokeMember来调用,而不能用GetProperty来检索
    4.但是这个结果是一个COM类的数组,我怎么能得到它的值呢?
    =>我想,既然只是用object来包装,还原并不是什么困难的事吧?
      

  4.   

    谢谢几位,我已经解决了,这是我的代码。object objDoc = Activator.CreateInstance(m_ComType_Document);
                    m_ComType_Document.InvokeMember("Create", BindingFlags.Default | BindingFlags.InvokeMethod, null, objDoc, new object[] { fileOpen });
                    m_ComType_Document.InvokeMember("OCR", BindingFlags.Default | BindingFlags.InvokeMethod, null, objDoc, new object[] { ocrLanuage, true, true });
                    object objImage0 = m_ComType_Document.InvokeMember("Images", BindingFlags.Default | BindingFlags.GetProperty, null, objDoc, new object[] { 0 });
                    if (objImage0 == null) return null;                if (m_ComType_Image == null) m_ComType_Image = objImage0.GetType();
                    object objLayout = m_ComType_Image.InvokeMember("Layout", BindingFlags.Default | BindingFlags.GetProperty, null, objImage0, null);
                    if (objLayout == null) return null;                if (m_ComType_Layout == null) m_ComType_Layout = objLayout.GetType();
                    strRetn = (string)m_ComType_Layout.InvokeMember("Text", BindingFlags.Default | BindingFlags.GetProperty, null, objLayout, null);
      

  5.   

    新的C#4.0的dynamic关键字就能解决你的问题。
    或者你用vb.net写