【问题标题】:Unable to load DLL the specified procedure could not be found. (Exception from HRESULT: 0x8007007F)无法加载 DLL 找不到指定的过程。 (来自 HRESULT 的异常:0x8007007F)
【发布时间】:2019-06-29 04:55:46
【问题描述】:

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

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

到目前为止,我已经在 非托管 C++Project 2)中创建了一个中间项目,以与项目 3 兼容。

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

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

无法加载 DLL 文件“PROJECT-ROUTE \ Project2.dll”:找不到指定的程序。 (来自 HRESULT 的异常:0x8007007F) 在project1.process()中

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

Middle proyect Unamanged C++ Code (Project 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
        }
    }

【问题讨论】:

  • 任何以 0x8 开头的异常都是无效指针(或访问超出限制的内存)。当您注册事件时,该事件可能在任何数据可用之前(或在构造函数异常期间)发生。例如,如果您有一个 Window Form 项目,您可以有一个 DGV,其最初的行数和列数设置为 -1。当您注册一个事件时,该事件可能在 DGV 创建行和列之前发生,因此您必须在行数和列数 > 零的事件。看起来您可能正在尝试在 WaterAnalyzer 构造函数运行(或完成)之前获取实例。
  • @jdweng 否,0x8xxxxxxx 表示第 31 位,设置了严重性位。该位表示成功或失败。所有指示错误的HRESULT 值都设置了该位。这个错误代码实际上是一个包含在 COM HRESULT 中的 Win32 错误。 0x8007xxxx 表示这是 Win32 错误。 Win32 错误是0x7F,即ERROR_PROC_NOT_FOUND
  • 大卫:你又错了。 Win32 错误来自 Intel Exception 寄存器,其中 MSB 为内存范围错误。

标签: c# c++ visual-studio dll dllimport


【解决方案1】:

假设您在此处提供的信息是正确的(我有疑问,因为您没有逐字复制它,从Proyect2.dll 的 DLL 名称可以看出)那么错误不可能是函数 @987654322找不到@。在这种情况下,错误必须在指向Project3 的链接中。

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

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

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

【讨论】:

  • 非常感谢!我的 Project3 的 DLL 与我的 C# 可执行文件位于同一目录中,但它已过期
猜你喜欢
  • 2016-08-23
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多