无法使用 c++/cli 包装器从 c# dll 加载函数
Unable to load function from c# dll using a c++/cli wrapper
这是我第一次从 c# dll 调用函数。
我制作了一个 c# 包装器 (c++/cli) 来从 c++ 调用 c# 函数。这个包装器本身是一个我想在我的主代码中使用的 dll。下面是 wrapper.h 和 wrapper.cpp 文件。 CSharpWrapper 是继承基础 class ImageTool 的抽象 class。在头文件的末尾,我正在导出包装器 class.
的工厂
wrapper.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;
}
wrapper.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() 时会出现以下错误:
在wrapper.exe in 0x00007ffd20b5a388(KernelBase.dll)中未经治疗的异常:0xE0434352(参数:0xFFFFFFFFFFFFFF580070002,0x0000000000000000000000000000000000000000000000000000000000000000000000,0000,0000,0000,000000 = 0.0000000000 = 0.00000000 = 0.000000 = 0.0000 = 000; 13=]
我尝试使用此方法加载 dll(如 main.cpp)和其他 c++ dll - 它有效。
我尝试使用 dependency_walker- 检查是否有任何丢失的 dll 有 none。
我包含了正确的 opencv 库,它们可以正常工作。我在项目属性中包含了 dll 和 lib 的路径,并在 Linker->Input 中添加了 lib 名称。
你能帮我调试一下这个问题吗?
这是一个与依赖项相关的错误。由于我试图从非托管调用托管代码,因此调试器生成的输出没有明确提及错误,只是输出 "Unhandled exception at 0x00...."。我使用 dependency walker 来寻找任何缺失的依赖项,但它找不到任何东西,可能是因为我试图在主代码中手动加载 dll。
AlexF 提到的 link 中的一个答案解决了我的问题。()
我先在configurationProperties->Debugging中把"Debugger Type"改成了"Mixed"模式。这导致了一个更详细的错误,它清楚地提到缺少哪个依赖项。并且我复制了 Debug 文件夹中的依赖项并且它有效。
这是我第一次从 c# dll 调用函数。
我制作了一个 c# 包装器 (c++/cli) 来从 c++ 调用 c# 函数。这个包装器本身是一个我想在我的主代码中使用的 dll。下面是 wrapper.h 和 wrapper.cpp 文件。 CSharpWrapper 是继承基础 class ImageTool 的抽象 class。在头文件的末尾,我正在导出包装器 class.
的工厂wrapper.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;
}
wrapper.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() 时会出现以下错误:
在wrapper.exe in 0x00007ffd20b5a388(KernelBase.dll)中未经治疗的异常:0xE0434352(参数:0xFFFFFFFFFFFFFF580070002,0x0000000000000000000000000000000000000000000000000000000000000000000000,0000,0000,0000,000000 = 0.0000000000 = 0.00000000 = 0.000000 = 0.0000 = 000; 13=]
我尝试使用此方法加载 dll(如 main.cpp)和其他 c++ dll - 它有效。
我尝试使用 dependency_walker- 检查是否有任何丢失的 dll 有 none。
我包含了正确的 opencv 库,它们可以正常工作。我在项目属性中包含了 dll 和 lib 的路径,并在 Linker->Input 中添加了 lib 名称。 你能帮我调试一下这个问题吗?
这是一个与依赖项相关的错误。由于我试图从非托管调用托管代码,因此调试器生成的输出没有明确提及错误,只是输出 "Unhandled exception at 0x00...."。我使用 dependency walker 来寻找任何缺失的依赖项,但它找不到任何东西,可能是因为我试图在主代码中手动加载 dll。
AlexF 提到的 link 中的一个答案解决了我的问题。()
我先在configurationProperties->Debugging中把"Debugger Type"改成了"Mixed"模式。这导致了一个更详细的错误,它清楚地提到缺少哪个依赖项。并且我复制了 Debug 文件夹中的依赖项并且它有效。