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

时间:2019-02-05 11:21:20

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

很长一段时间以来,我在我必须实施的项目中遇到问题,我都会向您解释。

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

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

Project 2包含一个非常简单的方法,该方法可初始化Project 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;
    }
}

中间产品没有代码的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 :(得分:0)

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

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

确保正在加载的Project3.dll版本是最新的,并且与您用来构建.h的{​​{1}}和.lib文件相匹配。

您只需要提供DLL的文件名,而不是在C#代码中提供DLL的绝对路径即可。将这两个DLL与C#可执行文件放在同一目录中。