La mia applicazione compila bene, ma ottengo il seguente errore di runtime:Identificare dipendenze problematiche nel progetto C++/CLI
System.IO.FileNotFoundException was unhandled
HResult=-2147024770
Message=Could not load file or assembly {Wrapper} or one of its dependencies. The specified module could not be found.
Il riferimento al wrapper nell'applicazione che si chiama sembra corretto. La dll Wrapper esiste nella posizione corretta.
Questo progetto è stato utilizzato per creare ed eseguire sul sistema di qualcun altro, l'ho visto dimostrato più volte. Quella persona/computer non è più disponibile. Alcuni percorsi di alcune dipendenze sono cambiati dall'ultima volta che è stato creato ed eseguito correttamente, ho corretto tutti gli errori di compilazione relativi a questo.
Giusto per chiarire la mia struttura del progetto:
Digraph G
{
App [ label = "My C# Application"]
Wrapper [ label = "C++/CLI Wrapper"]
Lib [ label = "C++ Library"]
Dll [ label = "My helper C# DLL"]
CDep [ label = "Series of deep C++ dependencies managed \n by CMake for Lib, hard coded relative paths for Wrapper."]
App->Wrapper->Lib->CDep;
App->Dll->Wrapper->CDep;
}
Wrapper è un C++/CLI wrapper per una libreria C++. L'errore viene attivato quando proviamo a caricare una classe nell'applicazione che ha un'istruzione using per il wrapper.
Il wrapper ha molte dipendenze, ma il messaggio di errore non indica quale dipendenza sia problematica. Questo è un sistema ampio e complicato, la maggior parte delle quali è costruita da altri team. I componenti C++ utilizzano CMake per ottenere tutte le dipendenze corrette, ma CMake non supporta C# in modo nativo.
Ho provato a utilizzare fuslogvw per trovare l'errore di associazione, ma non mi ha mostrato assolutamente nulla finché non ho modificato le impostazioni per includere tutti i binding e quindi ha mostrato solo vincoli riusciti. http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.100).aspx
I percorsi sono lunghi ma non superiori a 256 caratteri.
Avevo un avviso nella compilazione per Dll (vedi grafico sopra): Avviso 1 C'è stata una mancata corrispondenza tra l'architettura del processore del progetto in fase di costruzione "MSIL" e l'architettura del processore del riferimento "{cli_wrapper.dll } "," AMD64 ". Questa mancata corrispondenza potrebbe causare errori di runtime. Si prega di prendere in considerazione la possibilità di modificare l'architettura del processore di destinazione del progetto tramite Configuration Manager in modo da allineare le architetture del processore tra il progetto e i riferimenti, o prendere una dipendenza dai riferimenti con un'architettura del processore che corrisponda all'architettura del processore di destinazione del progetto.
In Configuration Manager, la DLL sta creando per piattaforma "Qualsiasi CPU" e Wrapper sta creando per "x64". Ho cambiato la DLL in x64. Ricevo ancora l'errore di runtime.
Could not load file or assembly or one of its dependencies Eseguito un contenuto di directory di compilazione pulito e cancellato. Nessun cambiamento. Riapri Visual Studio. Nessun cambiamento. Provato a cambiare nome assembly, spazio dei nomi predefinito e nome del progetto in modo che corrispondano. Nessun cambiamento.
Could not load file or assembly 'xxx' or one of its dependencies. An attempt was made to load a program with an incorrect format Credo che dobbiamo compilare per 64 bit. Siamo dipendenti da una libreria C++ a 64 bit.
Could not load file or assembly ... The parameter is incorrect Sono un amministratore locale.
How to enable assembly bind failure logging (Fusion) in .NET Provato le impostazioni del Registro di sistema, ma sembrano essere solo impostazioni fuslogvw. Nessun miglioramento dei dati di registro disponibili.
Molte altre domande simili avevano ASP o il servizio installa risposte specifiche.
+1. Bump. Chiunque suggerisca addirittura un suggerimento su "Che cosa hai provato?" dovrebbe essere battuto con un tubo di ferro Non sono un ragazzo CLI/.NET quindi non ho una risposta per questo, ma spero sinceramente di trovarne uno. Te lo meriti, se non altro per la presentazione di questa domanda, che è * notevole *. – WhozCraig
Grazie. Di solito quando costruisco uno di questi finisco per rispondere alla mia stessa domanda prima di postare, ma non questa volta. –
Ulteriori informazioni: Wrapper utilizza un evento prebuild per chiamare la build di una delle sue dipendenze, ma la maggior parte delle dipendenze sono librerie statiche a 64 bit predefinite. –