2013-06-26 3 views
3

У меня есть три программы -Почему установка Office 2013 сменила WinForms RichTextBox после использования MAPI?

Программа 1: надстройка Microsoft Outlook, которая дополнительно использует MAPI.

Программа 2: Автономный ех, что не сделать любое использование MAPI

Программа 3: Автономный ех, что делает грим использования MAPI.

Все три программы написаны на C# и в какой-то момент используют WinForms RichTextBox.

На 8 установки x64 Windows, с Office 365 программы «1» и «3» не имеют никаких проблем, но программа «2» падает, как только управление RichTextBox строится с помощью следующего пакета:

System.IO.FileNotFoundException : C:\Program Files (x86)\Common Files\Microsoft Shared\Office15\riched20.dll 
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName) 
at System.Windows.Forms.RichTextBox.get_CreateParams() 
at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext) 
at System.Windows.Forms.TextBoxBase..ctor() 
at System.Windows.Forms.RichTextBox..ctor() 
<snip> 

Демонтаж RichTextBox.get_CreateParams() показывает, что он вызывает LoadLibrary на 'riched20.dll', а затем GetModuleFileName в загруженном модуле.

Для программы 2 Visual Studio сообщает мне, что она загрузила файл riched20.dll из пути «C: \ Program Files \ Microsoft Office 15 \ root \ vfs \ ProgramFilesCommonX86 \ Microsoft Shared \ OFFICE15 \ RICHED20.DLL".

После этого вызов FileVersionInfo.GetVersionInfo() завершился неудачно, поскольку путь, который он задал, не существует.

Однако - программа 1 (Outlook-addin) также загрузила файл riched20.dll с одного и того же пути - и все же так или иначе это удается!

Программа 2, которая не загружается интерфейс MAPI работает отлично, и он загружает riched20.dll из C: \ Windows \ syswow62

Программа 3 инициализирует интерфейс MAPI, прежде чем он создает богатое текстовое поле, и я знаю, что некоторые функции MAPI изменит ваш текущий рабочий каталог в каталог MAPI. Вероятно, это объясняет, почему программа 3 загружает файл riched20.dll и программу 2, загружая копию system32.

Я подозреваю, что разница между работой программы 1 и ошибкой программы 3 заключается в том, что vfs в пути означает «виртуальная файловая система», и поэтому программа 1, работающая в качестве дополнения Outlook, может каким-то образом найти файл riched20.dll, используя путь, который на самом деле не существует.

Все три программы работают с предыдущими версиями офиса.

Как правило, вызов «LoadLibrary (« riched20.dll ») перед инициализацией MAPI устраняет проблему, но чувствует себя как ужасный хак.

Я также не нашел никакой информации об этом пути «vfs» и о том, что он означает в Интернете.

Для моего собственного образования кто-нибудь может лучше объяснить, что здесь происходит?

Обновление: У меня есть все, что нужно для разработки, это как-то связано с функцией «нажимать-работать».

+1

Да, путь соответствует установочной установке Outlook 2013 для запуска. Можете ли вы загрузить правильную dll раньше времени, чтобы убедиться, что она загружена к моменту загрузки и инициализации MAPI? –

+0

Да, я могу ... (Лучше поздно, чем никогда!) – sger6218

ответ

5

Решение было использовать pinvoke для вызова LoadLibrary на 'riched20.dll' до инициализации MAPI.

[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
public static extern IntPtr LoadLibrary(string lpFileName); 

LoadLibrary("riched20"); 
+0

Отличное объяснение, спасло меня много времени, спасибо. –

+0

У вас когда-либо возникали проблемы с этим решением или он работает стабильно? – MartinHappyCoding

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

  • Нет связанных вопросов^_^