2013-05-28 28 views
7

Ho una DLL C++ non gestita che vorrei richiamare da un exe C#. Ho esaminato le possibili soluzioni e mi sembra che la cosa migliore da fare sia usare C++/CLI come wrapper per la classe C++ non gestita. Così ho scritto una classe C++/CLI che assomiglia a questo, e viene compilata in una DLL (so che dovrebbe avere un distruttore e un finalizzatore, ma finora il codice non entrerà nella funzione Main, quindi li ho esclusi per ragioni di semplicità):EEFileLoadException durante il caricamento di DLL C++ nella DLL gestita

#include <cppheader.h> 

using namespace System; 

namespace DependencyInterface 
{ 
    public ref class DependencyTester 
    { 
    public: 
    DependencyTester() 
    { 
     _class = new CPPClass(); 
    } 

    private: 
    CPPClass* _class; 
    }; 
} 

ho poi hanno un C# eseguibile che assomiglia a questo:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using DependencyInterface; 

namespace DependencyTest2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DependencyTester tester; 
     } 
    } 
} 

Purtroppo, quando cerco di eseguire il codice, ottengo il seguente C un'eccezione ++:

First-chance exception at 0x000007fefd5a9e5d in DependencyTest2.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x0094ca58.. 

Ho provato a impostare un punto di interruzione sulla prima riga di Main, ma l'eccezione viene lanciata prima che l'esecuzione raggiunga quel punto. Se mi ha colpito "continua" (sto usando MVS 2010) ottengo questo:

First-chance exception at 0x76d8c5e2 in DependencyTest2.exe: 0xC0000005: Access violation reading location 0x0000000000000020. 

Qualcuno ha qualche consiglio? Questo è su Windows 7 x64, e tutto è stato compilato per x64 inclusa la DLL C++.

+1

Ho bisogno di vedere la traccia dello stack per effettuare la chiamata. Ma prima sposta il debugger in modalità gestita in modo da poter visualizzare le eccezioni gestite effettive. –

risposta

6

Un EEFileLoadException indica che l'eseguibile non può trovare o caricare una delle sue dipendenze. Ciò può naturalmente avere cause diverse (problemi di percorso, configurazioni di missaggio, piattaforme di missaggio).

Un buon inizio è l'utilizzo di Dependency Walker (assicurarsi di utilizzare la versione x64) dei file eseguibili o delle DLL.

+0

Whoo, ci sono voluti per sempre! Sì, il problema era con alcune librerie collegate alla mia libreria C++. –

1

Avevo un problema simile in cui stavo riferendo una dll nel progetto C# e quella dll di riferimento aveva dipendenza da alcune altre DLL che non includevo nella mia soluzione. Il problema è stato risolto dopo aver aggiunto il riferimento alle DLL mancanti nella mia soluzione. In alternativa, è possibile copiare le DLL mancanti direttamente nella directory dell'applicazione. L'uso di Dependency Walker non è stato d'aiuto in quanto non mostravano i nomi delle dll mancanti.

Problemi correlati