0

语境:

  1. 我有一个 WPF 应用程序,它使用 D:\WordAutomation\MyApp_Source\Executables\MyApp 文件夹中的某些非托管 DLL。我可以双击 exe 并运行一切。
  2. 接下来我有一个 Word 2007 代码隐藏项目,它引用上述文件夹中的相关托管 DLL 并尝试做同样的事情.. 调出 App UI。经过充分的'macheting'后,我的用户界面就会显示出来。但是现在有一个用户操作强制加载一个非托管 dll,该 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:运行同一行,但从 Word 代码隐藏 .cs 文件中启动

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 环境变量。还是一样。
  • 任何我能想到的......在过去的几天里

我注意到 Word 似乎正在将托管 ref 程序集复制到如下片段所示的位置。这可能是一个调查线。但是为什么 word 这样做以及它如何解决非托管 DLL .. 我不知道。同样在第一个片段中,有一些从 WinSXS 路径加载的 DLL,这也可能是另一个线索。

'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.

终于优雅地关闭了……救命!!

4

1 回答 1

1

要找出导致问题的 dll 以及正在查找 dll 的位置,请使用 ProcessMon(来自 sysinternals)。

在这里查看我的答案: 参考答案

于 2008-11-26T10:06:12.310 回答