如题,我想用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);
请问各位大大,我该如何解决呀,什么方法都可以,只要没有那个讨厌的“尾巴”就行。
一般的方法是通过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);
请问各位大大,我该如何解决呀,什么方法都可以,只要没有那个讨厌的“尾巴”就行。
解决方案 »
- c#实现一个窗体调用另一个窗体的控件
- 现在做一套ERP(SCM,财务,固定资产管理,OA,HR)用什么工具好!
- Word文档转换成PDF(C#)
- VS2005中如何在一个原来以一个原来存在的项目基础上做更改,生成一个新的项目
- 问个菜问题.vs2008选择生成之后总是默认弹出输出窗口.怎么让他不弹出来.内详
- c/s 文件更新的问题
- 如何用程序"在桌面上锁定web项目"?
- 在picturebox上画图,picturebox加滚动条,如何实现
- 如何用FindControl取出DataGrid的HeaderTemplate中的控件
- 用streamreader显示中文的问题?
- VS2008 setup project,怎样把安装路径固定,不让用户改变?
- 如果显示键盘输入
3,我曾想过,把Interop.***.dll包含进程序集,然后EXE运行后从资源里获取程序集反射调用相应的方法。这种方法我感觉很“菜”所以不到万不得已我暂时不考虑。
4,我曾想过,用C++的调用方式方法,可是。哎。不行。。
5,我曾想过,,,,哎,想的多了,就是想不出解决办法。。
//下面这句返回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类的数组,我怎么能得到它的值呢?
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来包装,还原并不是什么困难的事吧?
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);
或者你用vb.net写