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++.
Muszę zobaczyć ślad stosu, aby wykonać połączenie. Ale najpierw przełącz debugger na tryb zarządzany, aby zobaczyć faktyczny zarządzany wyjątek. –