gpt4 book ai didi

c# - 无法使用 c++/cli 包装器从 c# dll 加载函数

转载 作者:行者123 更新时间:2023-11-30 04:59:10 33 4
gpt4 key购买 nike

<分区>

这是我第一次从 c# dll 调用函数。

我制作了一个 c# 包装器 (c++/cli) 来从 c++ 调用 c# 函数。这个包装器本身是一个我想在我的主代码中使用的 dll。下面是 wrapper.h 和 wrapper.cpp 文件。 CSharpWrapper 是继承基类ImageTool 的抽象类。在头文件的末尾,我正在导出包装器类的工厂。

包装器.h

#define Export_Wrapper

#ifdef Export_Wrapper
#define _DLLExport __declspec(dllexport)
#else
#define _DLLImport __declspec(dllimport)
#endif // Export_Wrapper

class CSharpWrapperPrivate;

class _DLLExport CSharpWrapper : public ImageTool
{
public:
CSharpWrapper();
~CSharpWrapper();

int Initialize();
int Deinitialize();
cv::Mat AcquireImg(double positionX, double positionY);

private:
CSharpWrapperPrivate* _private;
};

extern "C" __declspec(dllexport) ImageTool* __cdecl createFactory()
{
return new CSharpWrapper;
}

包装器.cpp

class CSharpWrapperPrivate
{
public:
msclr::auto_gcroot<ImageDistiller^> ImageAPI;
};

CSharpWrapper::CSharpWrapper()
{
}

CSharpWrapper::~CSharpWrapper()
{
delete _private;
}

int CSharpWrapper::Initialize()
{
_private = new CSharpWrapperPrivate();
_private->ImageAPI = gcnew ImageDistiller();
return _private->ImageAPI->Initialize();
}

int CSharpWrapper::Deinitialize()
{
return _private->ImageAPI->Deinitialize();
}

cv::Mat CSharpWrapper::AcquireImg(double positionX, double positionY)
{
Mat img = _private->ImageAPI->AcquireImg(positionX, positionY);
}/**/

在 wrapper.cpp 文件中,visual studio 能够建议 c# dll 中可用的函数。以下是我试图通过此包装器调用函数的 main.cpp 代码。

main.cpp

typedef ImageTool*(__cdecl *ImgFactory)();

ImageTool* instance_imgcapture;
HINSTANCE dll_imgcapture_handle;

int main()
{
dll_imgcapture_handle = ::LoadLibrary(TEXT("wrapper.dll"));
if (!dll_imgcapture_handle) {
std::cerr << "Unable to load wrapper DLL!\n";
return 1;
}

ImgFactory zximgcapturefactory = reinterpret_cast<ImgFactory>(::GetProcAddress(dll_imgcapture_handle, "createFactory"));
if (!zximgcapturefactory)
{
std::cerr << "Unable to load factory from wrapper.dll!!\n";
::FreeLibrary(dll_imgcapture_handle);
return 1;
}

instance_imgcapture = zximgcapturefactory();
instance_imgcapture->Initialize();

return 1;
}

现在,当我运行 main.cpp 时,它能够创建 dll_imgcapture_handle 和 ImgFactory。但是当调用 instance_imgcapture->Initialize() 时会出现以下错误:

Unhandled exception at 0x00007FFD20B5A388 (KernelBase.dll) in wrapper.exe: 0xE0434352 (parameters: 0xFFFFFFFF80070002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007FFD03580000).

我尝试使用此方法加载 dll(如在 main.cpp 中)和其他 c++ dll - 它有效。我尝试使用 dependency_walker 检查是否有任何丢失的 dll - 没有。我包含了正确的 opencv 库,它们可以正常工作。我在项目属性中包含了 dll 和库的路径,并在 Linker->Input 中添加了库名称。

你能帮我调试一下这个问题吗

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com