2013-05-28 3 views
7

У меня есть неуправляемая C++ DLL, с которой я бы хотел позвонить из C# exe. Я рассмотрел возможные решения, и мне кажется, что лучше всего использовать C++/CLI в качестве оболочки для неуправляемого класса C++. Поэтому я написал класс C++/CLI, который выглядит так и компилируется в DLL (я знаю, что он должен иметь деструктор и финализатор, но до сих пор код не попадает в главную функцию, поэтому я исключил их для ради простоты):EEFileLoadException при загрузке DLL на C++ в управляемой DLL

#include <cppheader.h> 

using namespace System; 

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

    private: 
    CPPClass* _class; 
    }; 
} 

Я тогда C# исполняемый файл, который выглядит следующим образом:

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

к сожалению, когда я пытаюсь запустить код, я получаю следующее C++ исключение:

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

Я попытался установить точка останова в первой строке Main, но исключение бросается до того, как выполнение достигнет этой точки. Если я нажму «продолжить» (я использую MVS 2010), я получаю следующее:

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

У кого-нибудь есть совет? Это на Windows 7 x64, и все было скомпилировано для x64, включая C++ DLL.

+1

Мне нужно увидеть трассировку стека, чтобы позвонить. Но сначала переключите свой отладчик в управляемый режим, чтобы вы могли видеть фактическое управляемое исключение (исключения). –

ответ

6

EEFileLoadException указывает, что исполняемый файл не может найти или загрузить одну из его зависимостей. Разумеется, это может иметь разные причины (проблема пути, микширование конфигураций, микширование платформ).

Хорошее начало использования Dependency Walker (убедитесь, что вы используете версию x64) в своих DLL/исполняемых файлах.

+0

Whoo, это навсегда! Да, проблема была в некоторой библиотеке, с которой связана моя библиотека на C++. –

1

У меня была аналогичная проблема, когда я ссылался на DLL в проекте C#, и эта ссылка на dll сама зависела от некоторых других DLL, которые я не включил в свое решение. Проблема была решена после того, как я добавил ссылку на отсутствующие DLL в моем решении. Кроме того, вы можете скопировать отсутствующие DLL-файлы непосредственно в каталог приложения. Использование Dependency Walker не помогло, поскольку они не отображали имена отсутствующих DLL.

Смежные вопросы