无法加载 DLL,找不到指定的过程。 (HRESULT 异常:0x8007007F)

Unable to load DLL the specified procedure could not be found. (Exception from HRESULT: 0x8007007F)

长期以来我有一个项目有问题,我必须在我的项目中实施,我会向你解释。

我的目标是从 C# 应用程序(项目 1 调用 C++ class,问题是 C++ 项目(项目 3) 与 CLR 不兼容。

我到目前为止所做的是在 非托管 C++项目 2)中创建了一个中间项目以兼容与项目 3.

项目 2 包含一个非常简单的方法,该方法从项目 3 初始化一个 class 并将此对象用于不同的操作。

我在 Visual Studio 工作,编译时它没有给我错误,但是在 运行 时我得到以下错误:

Unable to load the DLL file 'PROJECT-ROUTE \ Project2.dll': The specified procedure could not be found. (Exception from HRESULT: 0x8007007F) in project1.process ()

问题是只有在 project2 方法中我从项目 3 初始化 class 时才会出现之前的错误,如果我注释初始化行那么一切顺利,我不明白为什么在 2 之间同类型的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;
    }
}

中间项目 Unamanged 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
        }
    }

假设您在此处提供的信息是正确的(我对此表示怀疑,因为您没有逐字复制它,从 Proyect2.dll 的 DLL 名称可以看出),那么错误不可能是未找到函数 process。在这种情况下,错误必须在 linking 到 Project3.

您的 Project2.dll 可能正在尝试 link 到 Project3.dll 和未从 Project3.dll 导出的函数。这将解释您报告的行为。如果您在构建 Project2.dll 时 link 编辑的 Project3.lib 文件与运行时可执行文件找到的 Project3.dll 文件不匹配,通常会发生这种情况。

确保正在加载的 Project3.dll 版本是最新的并且与您用于构建 Project2.dll.h.lib 文件相匹配。

与其在 C# 代码中提供 DLL 的绝对路径,不如提供 DLL 的文件名。将两个 DLL 放在与 C# 可执行文件相同的目录中。