2014-01-09 8 views
1

Я разработать DLL, которая использует Microsoft.Office.Interop.Word ссылки версии 14. Слово версии, установленной на моей машине 2010.Не удалось загрузить Microsoft.Office.Interop.Word

Когда я устанавливаю мою DLL на другой машины, которые имеют Word 2007 или 2003 версии, я получаю следующее сообщение об ошибке:

Could not load file or assembly 'Microsoft.Office.Interop.Word version=14.0.0 

я нашел here что Заданная настройка «Типы Код Interop» на «True» может решить эту проблему, но когда я делаю это так, ошибка происходит, когда я использую Microsoft.Office.Interop.Word.ApplicationClass в коде;

Interop type 'Microsoft.Office.Interop.Word.ApplicationClass' cannot be embedded 

Любые идеи, что мне делать, чтобы установить dll на машины с предыдущей версией Word?

+1

http://stackoverflow.com/questions/13383250/could-not-load-assembly-interop-word-version-14-0-0-0?rq=1 – DotNetDeveloper

+0

Я связал его себе – user3165438

+0

версии «Word» является одной из причин, почему я использую [последнее обязательное] (http://stackoverflow.com/search?q=c%23+word+late+binding). – Sinatr

ответ

1

Я приведу здесь рабочий пример использования позднего связывания со словом. Это было сделано некоторое время назад, и, вероятно, стоит переписать с 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 не используется) ;
+0

Большое вам спасибо за ваш быстрый ответ! Сейчас я посмотрю. – user3165438

+0

Я пробовал код выше - он создает один другой документ, кроме того, который у меня был раньше. Что это значит? – user3165438

+0

Это потому, что он вызывает 'Documents.Add'. Я понятия не имею, что такое документ, который у вас есть раньше. Если у вас есть код, вы должны его преобразовать, как описано выше, если вы решите использовать позднюю привязку. – Sinatr

Смежные вопросы