Risoluzione dei problemi: impossibile trovare una DLL non gestita referenziata quando si richiama codice personalizzato tramite un codice di Word

StackOverflow https://stackoverflow.com/questions/319964

Domanda

Contesto:

  1. Ho un'app WPF che utilizza determinate DLL non gestite nella cartella D: \ WordAutomation \ MyApp_Source \ Executables \ MyApp. Posso fare doppio clic sull'exe e tutto funziona.
  2. Successivamente ho un progetto code-behind di Word 2007, che fa riferimento a DLL gestite pertinenti nella cartella sopra e cerca di fare la stessa cosa. Visualizzate l'interfaccia utente dell'app. Dopo un'adeguata "lavorazione", visualizzo l'interfaccia utente. Ma ora c'è un'azione dell'utente che forza il caricamento di una delle dll non gestite che esplode in modo coerente con FileNotFoundException (senza aiuto / indicazione di quale file manca)

Ho posizionato un punto di interruzione sulla riga del problema, ho cancellato la finestra di output, premi F10, ho confrontato l'output quando eseguo quella linea (aggiungendo un oggetto a un oggetto ObservableCollection, il cui gestore CollectionChanged ha un codice che carica il pezzo non gestito)

Caso 1: fai doppio clic su EXE .. che funziona perfettamente (leggermente spezzato)

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

Caso 2: eseguire la stessa riga, ma avviato da un file .cs dietro il codice 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).

Ho provato

  • aggiunta delle DLL non gestite nella stessa cartella della (word doc + VSTO dll)
  • ha aggiunto la cartella alla PATH Variabile d'ambiente . Ancora lo stesso.
  • qualsiasi cosa mi sia venuta in mente .. negli ultimi due giorni

Ho notato che Word sembra copiare gli assembly di riferimento gestiti in una posizione come mostrato nello snippet di seguito .. che potrebbe essere una linea di indagine. Ma perché la parola lo sta facendo e come risolve le DLL non gestite .. Non lo so. Anche nel primo frammento, ci sono alcune DLL caricate da un percorso WinSXS, che potrebbe anche essere un altro vantaggio.

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

Finalmente per chiudere con grazia ... Aiuto !!

È stato utile?

Soluzione

Per scoprire quale dll sta causando il problema e dove viene cercata la dll, usa ProcessMon (privo di sysinternals).

Vedi la mia risposta qui: Risposta a cui si fa riferimento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top