[英]How to achieve late binding in c# for Microsoft.office.interop.word?
I want to achieve late binding for the following lines of code which are using early binding. 我想为使用早期绑定的以下代码行实现后期绑定。 How can I achieve it in C#?
如何在C#中实现?
When I removed Microsoft.office.interop.word reference, I am getting some errors, which are mentioned in the comments in following code. 当我删除Microsoft.office.interop.word参考时,出现了一些错误,这些错误在以下代码的注释中提到。 Folloowing is the code I am using to convert a word document to pdf.
以下是我用来将Word文档转换为pdf的代码。
Type wordType = Type.GetTypeFromProgID("Word.Application");
dynamic Word = Activator.CreateInstance(wordType);
object oMissing = System.Reflection.Missing.Value;
DirectoryInfo dirInfo = new DirectoryInfo(@"\\server\folder");
FileInfo wordFile = new FileInfo(fileName);
Word.Visible = false;
Word.ScreenUpdating = false;
Object filename = (Object)wordFile.FullName;
var doc = Word.Documents.Open(ref filename);
doc.Activate();
object outputFileName = wordFile.FullName.Replace(".doc", ".pdf");
/*Getting an error in WdSaveFormat */
object fileFormat = WdSaveFormat.wdFormatPDF;
doc.SaveAs(ref outputFileName, ref fileFormat);
/*Getting an error in WdSaveOptions */
object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
/*Getting an error in _Document*/
((_Document)doc).Close(ref saveChanges);
doc = null;
Word.Quit();
MessageBox.Show("Successfully converted");
Historically, late binding was possible (and still is!) with reflection: 从历史上看,后期绑定是可能的(现在仍然是!):
object word = ...;
object[] args = new object [] { oMissing, oMissing, oMissing };
word.GetType().InvokeMember( "Quit",
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null, word, args );
With the introduction of dynamics in C#4, late binding is just a matter of switching to the dynamic binder: 随着C#4中动力学的引入,后期绑定仅是切换到动态绑定器的问题:
dynamic word = ...;
word.Quit();
It is really as simple as that, you don't even have to pass these optional parameters to the Quit
method. 就这么简单,您甚至不必将这些可选参数传递给
Quit
方法。 The only drawback is that there is no intellisense on the dynamically typed code. 唯一的缺点是在动态键入的代码上没有智能感知。
More on that here in the Dino's article: 有关“恐龙”的更多信息,请参见:
http://msdn.microsoft.com/en-us/magazine/ff714583.aspx http://msdn.microsoft.com/zh-CN/magazine/ff714583.aspx
Made the following changes, Its working fine now. 进行了以下更改,现在可以正常工作。
Type wordType = Type.GetTypeFromProgID("Word.Application");
dynamic Word = Activator.CreateInstance(wordType);
object oMissing = System.Reflection.Missing.Value;
DirectoryInfo dirInfo = new DirectoryInfo(@"\\server\folder");
FileInfo wordFile = new FileInfo(fileName);
Word.Visible = false;
Word.ScreenUpdating = false;
Object filename = (Object)wordFile.FullName;
var doc = Word.Documents.Open(ref filename);
doc.Activate();
object outputFileName = wordFile.FullName.Replace(".doc", ".pdf");
/*in the WdSaveFormat enum, 17 is the value for pdf format*/
object fileFormat = 17;
doc.SaveAs(ref outputFileName, ref fileFormat);
/in the WdSaveOptions enum, 0 is for Do not save pending changes.*/
object saveChanges = 0;
doc.Close(ref saveChanges);
doc = null;
Word.Quit();
MessageBox.Show("Successfully converted");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.