2013-05-28 12 views
7

Posiadam niezarządzaną bibliotekę DLL w C++, do której chciałbym wywołać z poziomu C# exe. Przyjrzałem się możliwym rozwiązaniom i wygląda na to, że najlepiej jest użyć C++/CLI jako opakowania dla niezarządzanej klasy C++. Więc napisałem klasę C++/CLI, która wygląda tak, i zostaje skompilowana do biblioteki DLL (wiem, że powinna ona mieć destruktor i finalizator, ale do tej pory kod nie dostanie się do funkcji Main, więc wykluczyłem je dla uproszczenia):Wyjątek EEFileLoadException podczas ładowania biblioteki DLL C++ w zarządzanej bibliotece DLL

#include <cppheader.h> 

using namespace System; 

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

    private: 
    CPPClass* _class; 
    }; 
} 

mam następnie C# plik wykonywalny, który wygląda tak:

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; 
     } 
    } 
} 

Niestety, gdy próbuję i uruchomić kod, pojawia się następujący C++ wyjątek:

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

Próbowałem ustawić punkt przerwania w pierwszym wierszu Main, ale wyjątek jest generowany, zanim wykonanie osiągnie ten punkt. Jeśli kliknę "Kontynuuj" (używam MVS 2010) Otrzymuję to:

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

Czy ktoś ma jakieś porady? Jest to na Windows 7 x64, a wszystko zostało skompilowane dla x64, w tym DLL C++.

+1

Muszę zobaczyć ślad stosu, aby wykonać połączenie. Ale najpierw przełącz debugger na tryb zarządzany, aby zobaczyć faktyczny zarządzany wyjątek. –

Odpowiedz

6

Wyjątek EEFileLoadException wskazuje, że plik wykonywalny nie może znaleźć ani wczytać jednej z jego zależności. To oczywiście może mieć różne przyczyny (problem z torami, konfiguracje mieszania, platformy miksujące).

Dobrym początkiem jest używanie Dependency Walker (upewnij się, że korzystasz z wersji x64) na plikach DLL/plikach wykonywalnych.

+0

Whoo, to trwało wiecznie! Tak, problem dotyczył biblioteki, do której przyłączono moją bibliotekę C++. –

1

Miałem podobny problem, gdy odwoływałem się do biblioteki DLL w projekcie C#, a ta sama dll miała zależność od innych bibliotek dll, których nie uwzględniłem w moim rozwiązaniu. Problem został rozwiązany po dodaniu odwołania do brakujących bibliotek dll w moim rozwiązaniu. Alternatywnie możesz skopiować brakujące biblioteki dll bezpośrednio do katalogu aplikacji. Używanie Dependency Walker nie pomogło, ponieważ nie wyświetlały nazw brakujących bibliotek dll.

Powiązane problemy