Работа с MS Word Interop (RCW) через отражение
От: Eugene_asoiu  
Дата: 19.03.10 10:31
Оценка:
Есть задача: оптимизировать работу с MS Word по времени выполнения. Работа с Word построена через InvokeMember, т. е. через позднее связывание. Под профайлером было выявлено, что 90% времени занимает обращения к Property классов Word, т. е. такие вызовы:
dispObj.GetType().InvokeMember("%property_name%", BindingFlags.GetProperty, null, dispObj, null);

Напрямую использовать Interop сборку не представляется возможным, т. к. необходима поддержка нескольких версий Word.
В MSDN нашел, что
Type.GetTypeFromProgID("Word.Application");

возвращает тип Microsoft.Office.Interop.Word.ApplicationClass сборки, которая в находится в GAC на пользовательской машине (конечно если установлены .NET Framework и одна из версий MS Office).
Появилась мысль ускорить работу с Word через invoking of PropertyInfo. Практика показала, что это работает быстрее чем InvokeMember, но вот только есть одно НО, которое ставит крест на всей идее (по крайней мере у меня с MS Word 2007).
Interop класс не видно, если брать проперти Documents у Word.ApplicationClass, т. е я смотрю под дебаггером и вижу только System._ComObject. С которым ничего не поделаешь и найти через отражение его проперти нельзя. Но если через InvokeMember взять у documents какой нибудь документ, то он будет класса Microsoft.Office.Interop.Word.DocumentClass. В TypeLib Word посмотрел. Как раз какие классы там описаны для таких я только и могу получить interop классы, а вот для интерфейсов (типа Word.Documents) не могу (((.
object wordApp = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application")));
Type documentsType = a.GetType("Microsoft.Office.Interop.Word.Documents");
object documents = null;
PropertyInfo propDocuments = wordApp.GetType().GetProperty("Documents");
documents = propDocuments.GetGetMethod().Invoke(wordApp, null);
finally
{
wordApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, wordApp, null);
}

Help, please.
com interop microsoft office reflection
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.