【发布时间】: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值都设置了该位。这个错误代码实际上是一个包含在 COMHRESULT中的 Win32 错误。 0x8007xxxx 表示这是 Win32 错误。 Win32 错误是0x7F,即ERROR_PROC_NOT_FOUND -
大卫:你又错了。 Win32 错误来自 Intel Exception 寄存器,其中 MSB 为内存范围错误。
-
@jdweng en.m.wikipedia.org/wiki/HRESULT
标签: c# c++ visual-studio dll dllimport