Невозможно загрузить DLL, указанная процедура не найдена.(Исключение из HRESULT: 0x8007007F) - PullRequest
0 голосов
/ 05 февраля 2019

Долгое время у меня была проблема с проектом, который я должен реализовать в своем, я объясню вам.

Моя цель - вызвать класс C ++ из C #приложение ( проект 1 ), проблема в том, что проект C ++ ( проект 3 ) не совместим с CLR.

То, что я сделал до сих пор, имеетпромежуточный проект также был создан в неуправляемом C ++ ( Project 2 ) для совместимости с проектом 3.

Project 2 состоит из очень простого метода, которыйинициализирует класс из проекта 3 и использует этот объект для различных операций.

Я работаю в Visual Studio, и он не выдает ошибку при компиляции, но во время выполнения я получаю следующую ошибку:

Невозможно загрузить файл DLL 'PROJECT-ROUTE \ Project2.dll': указанная процедура не найдена.(Исключение из HRESULT: 0x8007007F) в project1.process ()

Дело в том, что предыдущая ошибка появляется только тогда, когда в методе project2 я инициализирую класс из проекта 3, если я комментирую инициализациютогда все идет хорошо, я не могу понять, почему между двумя C ++ проектами одного и того же типа возникают такие проблемы.

Может кто-нибудь мне помочь?

спасибо

Код C # (проект 1)

    private const string DllFilePath = @"PATH_TO_DLL\Proyect2.dll";

    [DllImport(DllFilePath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "process")]
    public extern static void process();

    [HandleProcessCorruptedStateExceptions]
    public static string Prox(string a, string b)
    {
        string str = "OK";
        try
        {

            process();
        }
        catch (System.AccessViolationException exception)
        {
            return exception.Message + " " + exception.StackTrace;
        }
        catch (Exception exception)
        {
            return exception.Message + " " + exception.StackTrace + " ";

        }

        return str;
    }
}

Средний проект Неизмененный код C ++ (проект 2)

Project2.h

    #include <stdexcept>
    #include "Project3.h"
    using namespace std;


    namespace FinalProcess
    {
        extern "C" { __declspec(dllexport) void __cdecl  process(); }
    }

Project2.cpp

    #include "Project2.h"
    #include <iostream>
    #include <chrono> // To measure execution time

    namespace FinalProcess
    {
        void process()
        {

            OCTA::Analyzer& ld = OCTA::Analyzer::getInstance(); // <-- Singleton
    // if I comment this line then it goes well
        }
    }

1 Ответ

0 голосов
/ 05 февраля 2019

Если предположить, что информация, которую вы здесь представляете, является правильной (и у меня есть сомнения, потому что вы не скопировали ее дословно, как видно из имени DLL Proyect2.dll), то ошибка не может быть в том, что функция process не найден.В этом случае ошибка должна быть в связи с Project3.

Ваш Project2.dll, вероятно, пытается связаться с Project3.dll и с функцией, которая не экспортируется из Project3.dll.Это объясняет поведение, о котором вы сообщаете.Обычно это происходит, если файл Project3.lib, который вы связали при сборке Project2.dll, не соответствует файлу Project3.dll, найденному исполняемым файлом во время выполнения.

Убедитесь, что версия Project3.dllзагружаемая версия обновлена ​​и соответствует файлам .h и .lib, которые вы использовали для создания Project2.dll.

Вместо того, чтобы указывать абсолютный путь к DLL в вашем коде C #, вы просто указываете имя файлаиз DLL.Поместите обе библиотеки DLL в один каталог с исполняемым файлом C #.

...