Устранение неполадок: не удается найти неуправляемую dll, на которую ссылаются, при вызове пользовательского кода с помощью кода Word - PullRequest
0 голосов
/ 26 ноября 2008

Контекст:

  1. У меня есть приложение WPF, которое использует некоторые неуправляемые библиотеки DLL в папке D: \ WordAutomation \ MyApp_Source \ Executables \ MyApp. Я могу дважды щелкнуть по exe, и все запускается.
  2. Далее у меня есть проект Word 2007 с выделенным кодом, который ссылается на соответствующие управляемые библиотеки DLL в указанной выше папке и пытается сделать то же самое ... вызвать интерфейс приложения. После адекватного «мачтинга» я показываю свой пользовательский интерфейс. Но теперь есть пользовательское действие, которое вызывает загрузку одной из неуправляемых библиотек, которая последовательно срывается с FileNotFoundException (без помощи / указания, какой файл отсутствует)

Я поместил точку останова на проблемную строку, очистил окно вывода. Нажмите F10, сравнил вывод при запуске этой строки (добавление объекта в ObservableCollection, чей обработчик CollectionChanged имеет код, загружающий неуправляемую часть)

Случай 1: Двойной щелчок на EXE .., который отлично работает (слегка подрезан)

'MyApp.DesktopApp.exe': Loaded 'D:\WordAutomation\MyApp_Source\Executables\MyApp\ManagedFrameworkWrapper.dll', Symbols loaded.
'MyApp.DesktopApp.exe': Loaded 'D:\WordAutomation\MyApp_Source\Executables\MyApp\Unmanaged.Framework.dll'
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll', Symbols loaded.
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcp90d.dll', Symbols loaded.
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugMFC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_2a62a75b\mfc90ud.dll', Symbols loaded.
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\system32\msimg32.dll'
'MyApp.DesktopApp.exe': Loaded 'D:\WordAutomation\MyApp_Source\Executables\MyApp\HelperFunctions.dll'
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\system32\dbghelp.dll'
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcm90d.dll', Symbols loaded.
'MyApp.DesktopApp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_11f3ea3a\mfc90enu.dll', Binary was not built with debug information.
CCollectionDataType ConstCCollectionDataType ConstCCollectionDataType ConstCCollectionDataType ConstCCollectionDataType ConstCCollectionDataType Const'MyApp.DesktopApp.exe' (Managed): Loaded 'D:\WordAutomation\MyApp_Source\Executables\MyApp\ManagedFrameworkWrapper.dll', Symbols loaded.
'MyApp.DesktopApp.exe' (Managed): Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcm90d.dll', Symbols loaded.
The thread 'Win32 Thread' (0x12ec) has exited with code 0 (0x0).

Вариант 2. Выполнение той же строки, но запущенной из .cs-файла Word с выделенным кодом.

A first chance exception of type 'System.IO.FileNotFoundException' occurred in WindowsBase.dll
The program '[5320] WINWORD.EXE: Managed' has exited with code 0 (0x0).

Я пытался

  • добавление неуправляемых DLL в в ту же папку , что и (word doc + VSTO dll)
  • добавил папку в переменную PATH Environment . Все тот же.
  • все, что я мог придумать ... за последние пару дней

Я заметил, что Word, кажется, копирует управляемые сборки ref в местоположение, как показано в фрагменте ниже ..., что может быть расследованием. Но почему Word делает это и как он разрешает неуправляемые библиотеки DLL ... Я не знаю. Также в первом фрагменте есть несколько библиотек DLL, загруженных из пути WinSXS, что также может быть другим лидерством.

'WINWORD.EXE' (Managed): Loaded 'C:\Documents and Settings\pillaigi\Local Settings\Application Data\assembly\dl3\6HQYB5GK.LY0\KC4WN109.HT4\4d81c901\70abeb86_124ec901\MyWPFPlotPopup.DLL', Symbols loaded.

Наконец-то грациозно закрыться ... Помогите !!

1 Ответ

1 голос
/ 26 ноября 2008

Чтобы узнать, какая dll вызывает проблему и где ее ищут, используйте ProcessMon (без sysinternals).

Смотрите мой ответ здесь: Ссылочный ответ

...