无法加载 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# 可执行文件相同的目录中。
长期以来我有一个项目有问题,我必须在我的项目中实施,我会向你解释。
我的目标是从 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# 可执行文件相同的目录中。