EEFileLoadException при использовании классов C# в C++ (win32 приложение)

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

27
задан Joel Coehoorn 7 December 2011 в 19:24
поделиться

2 ответа

Проблема состояла в том, где DLLs были расположены.

  • c:\dlls\managed.dll
  • c:\dlls\wrapper.dll
  • c:\exe\my.exe

я подтвердил это путем копирования managed.dll в c:\exe and it worked without issue. По-видимому, CLR не будет искать управляемый DLLs в пути неуправляемого DLL и будет только искать его, где исполняемый файл. (или в GAC).

По причинам, в которые не стоит войти, это - структура, в которой я нуждаюсь, который означал, что я должен был дать CLR руку расположенном управляемый dll. Посмотрите код ниже:

AssemblyResolver.h:

/// <summary>
/// Summary for AssemblyResolver
/// </summary>
public ref class AssemblyResolver
{
public:

static Assembly^ MyResolveEventHandler( Object^ sender, ResolveEventArgs^ args )
{
    Console::WriteLine( "Resolving..." );

    Assembly^ thisAssembly = Assembly::GetExecutingAssembly();
    String^ thisPath = thisAssembly->Location;
    String^ directory = Path::GetDirectoryName(thisPath);
    String^ pathToManagedAssembly = Path::Combine(directory, "managed.dll");

    Assembly^ newAssembly = Assembly::LoadFile(pathToManagedAssembly);
    return newAssembly;
}

};

Wrapper.cpp:

#include "AssemblyResolver.h"

extern "C" __declspec(dllexport) IMyObject* CreateMyObject(void)
{
    try
    {
        AppDomain^ currentDomain = AppDomain::CurrentDomain;
        currentDomain->AssemblyResolve += gcnew ResolveEventHandler( AssemblyResolver::MyResolveEventHandler );

        return new CMyWrapper( );
    }
    catch(System::Exception^ e)
    {
        System::Console::WriteLine(e->Message);

        return NULL;
    }
}
33
ответ дан Adam Tegen 28 November 2019 в 05:21
поделиться

Первый выпуск должен удостовериться, что тип Отладчика установлен на смешанный. Тогда Вы получаете полезные исключения.

9
ответ дан Adam Tegen 28 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: