Я приведу здесь рабочий пример использования позднего связывания со словом. Это было сделано некоторое время назад, и, вероятно, стоит переписать с dynamic
:
// try to open word
Type typeWordApplication = Type.GetTypeFromProgID("Word.Application");
if (typeWordApplication == null)
throw new Exception("Word is not installed (Word.Application is not found)");
object objWordApplication = Activator.CreateInstance(typeWordApplication);
object objDocuments = objWordApplication.GetType().InvokeMember("Documents", BindingFlags.GetProperty, null, objWordApplication, null);
object[] param = new object[] { Missing.Value, Missing.Value, Missing.Value, Missing.Value };
object objDocument = objDocuments.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objDocuments, param);
object start = 0;
object end = 0;
object objRange = objDocument.GetType().InvokeMember("Range", BindingFlags.InvokeMethod, null, objDocument, new object[] { start, end });
// set text
objRange.GetType().InvokeMember("Text", BindingFlags.SetProperty, null, objRange, new object[] { text });
// set font
object objFont = objRange.GetType().InvokeMember("Font", BindingFlags.GetProperty, null, objRange, null);
objFont.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, objFont, new object[] { "Courier" });
objFont.GetType().InvokeMember("Size", BindingFlags.SetProperty, null, objFont, new object[] { (float)8 });
start = objRange.GetType().InvokeMember("End", BindingFlags.GetProperty, null, objRange, null);
end = start;
objRange = objDocument.GetType().InvokeMember("Range", BindingFlags.InvokeMethod, null, objDocument, new object[] { start, end });
// select text
objRange.GetType().InvokeMember("Select", BindingFlags.InvokeMethod, null, objRange, null);
objWordApplication.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, objWordApplication, new object[] { true });
Marshal.ReleaseComObject(objWordApplication);
Преимущества него:
- вам не нужно ссылаться или распространять что-либо (если
GetTypeFromProgID
терпит неудачу - вы просто спросите пользователь, чтобы установить что-то).
- он скорее работает с любой версией установленного приложения, так как многие поддерживают обратную совместимость.
Недостатки:
- нет IntelliSense, вы должны будете просматривать себя документацию и объект класса, выяснить неочевидные вещи, получить опыт и т.д.
- очень громоздкий код (если
dynamic
не используется) ;
http://stackoverflow.com/questions/13383250/could-not-load-assembly-interop-word-version-14-0-0-0?rq=1 – DotNetDeveloper
Я связал его себе – user3165438
версии «Word» является одной из причин, почему я использую [последнее обязательное] (http://stackoverflow.com/search?q=c%23+word+late+binding). – Sinatr