Sto ricevendo System.IO.FileNotFoundException: The specified module could not be found
quando si esegue il codice C# che chiama un assembly C++/CLI che a sua volta chiama una DLL C pura. Accade non appena viene creato un oggetto che richiama le funzioni della DLL C pura.C# a C++/CLI a C DLL System.IO.FileNotFoundException
BackingStore è puro C. CPPDemoViewModel è C++/CLI che chiama BackingStore ha un riferimento a BackingStore.
Ho provato il caso più semplice possibile: aggiungere un nuovo progetto di test dell'unità C# che tenta solo di creare un oggetto definito in CPPDemoViewModel. Ho aggiunto un riferimento dal progetto C# a CPPDemoViewModel.
Un progetto di test C++/CLI funziona bene solo con l'aggiunta di CPPDemoViewModel quindi è qualcosa che va tra le lingue.
Utilizzo Visual Studio 2008 SP1 con .Net 3.5 SP1. Sto costruendo su Vista x64 ma sono stato attento ad assicurarmi che il mio target della piattaforma sia impostato su x86.
Mi sembra che qualcosa di stupido e ovvio mi manchi ma sarebbe ancora più stupido da parte mia perdere tempo a cercare di risolverlo in privato, quindi sono qui a disagio con me stesso!
Questo è un test per un progetto che esegue il porting di un'enorme quantità di codice C legacy che sto mantenendo in una DLL con un ViewModel implementato in C++/CLI.
modifica Dopo aver controllato le directory, posso confermare che il BackingStore.dll non è stato copiato.
Ho le cartelle di progetto univoche standard create con una soluzione multiprogetto tipica.
WPFViewModelInCPP BackingStore CPPViewModel CPPViewModelTestInCS bin Debug Debug
Il più alto livello di debug sembra essere una cartella comune usata dai progetti C e C++/CLI, con mia grande sorpresa.
WPFViewModelInCPP \ Debug contiene BackingStore.dll, CPPDemoViewModel.dll, CPPViewModelTest.dll e la loro .ilk associati e file PDB
WPFViewModelInCPP \ CPPViewModelTestInCS \ bin \ Debug contiene CPPDemoViewModel e CPPViewModelTestInCS .dll e file PDB, ma non BackingStore. Tuttavia, la copia manuale di BackingStore nella directory non ha corretto l'errore.
CPPDemoViewModel ha la proprietà Copia locale set che presumo sia responsabile della copia della DLL quando viene fatto riferimento. Non riesco ad aggiungere un riferimento da un progetto C# a una DLL C pura. Dice solo Impossibile aggiungere un riferimento a Backing Store.
Non sono sicuro di avere solo un problema o due.
È possibile utilizzare una fase di copia di copia vecchio stile per copiare il BackingStore.dll in qualsiasi directory del progetto C#, anche se speravo che il nuovo modello .net non lo richiedesse.
DependencyWalker mi sta dicendo che il file mancante è GPSVC.dll che has been suggested indica problemi relativi alle impostazioni di sicurezza. Sospetto che questa sia un'aringa rossa.
edit2 Con una copia manuale di BackingStore.dll per essere adiacente all'eseguibile, la GUI ora funziona correttamente. Il progetto di test C# ha ancora problemi che sospetto sia dovuto all'ambiente di runtime di un progetto di test, ma per ora posso vivere senza di esso.
Sì, lo so che è impertinente contrassegnare la propria risposta come accettata, ma nessun altro si è avvicinato alla vera risposta per i test, che ha richiesto una buona ora di ricerca. Sono ancora stordito che devo usare una tecnica così antiquata per copiare la DLL! –
Andy, dovresti ancora controllare il punto che ho sollevato, ho la sensazione che tu abbia avuto fortuna con l'ordine/tempo di inizializzazione, e possa diventare sfortunato in futuro senza una salda presa su questo. – RandomNickName42