很长一段时间以来,我在我必须实施的项目中遇到问题,我都会向您解释。
我的目标是从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
}
}
答案 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#可执行文件放在同一目录中。