我已经为原生C++ dll编写了C++/Cli包装器,但是当我从C#调用一些方法时,我的C++/Cli包装器DLL中出现System.AccessViolationException错误!有必要编组非托管类型或其他东西?!原生C++ dll的C++/CLI包装器
// Wrapper.h
typedef UnmanagedClass* (*Instance)(void);
private:
UnmanagedClass *m_object; // unmanaged object
// Wrapper.cpp
Wrapper:Wrapper()
{
HINSTANCE unmanagedLib;
unmangedLib = LoadLibrary(SystemStringToLPCSTR(dllPath+dllName));
// load instance
Instance _createInstance = (Instance)GetProcAddress(unmangedLib, "GetInstance");
m_object = (_createInstance)();
}
Wrapper::~Wrapper()
{
m_object->~UnmanagedClass();
}
Uint32 Wrapper::SomeMethod(Uint8 *bytRecvBuffer, int &iRecvLen)
{
return m_object->SomeMethod(bytRecvBuffer, iRecvLen);
}
// Unmanaged Class
class UnmanagedClass
{
public:
/**
* Default constructor.
*/
UnmanagedClass(void);
/**
* Default Destructor
*/
~UnmanagedClass(void);
virtual Uint32 Wrapper::SomeMethod(Uint8 *bytRecvBuffer, int &iRecvLen);
};
// export the UnmanagedClass object
extern "C" _declspec(dllexport) UnmanagedClass* GetInstance();
// UnamangedClass.cpp
UnamangedClass::~UnamangedClass(void)
{
if (UnamangedClassDLL != NULL)
FreeLibrary(UnamangedClassDLL);
UnamangedClassDLL = NULL;
}
extern "C" _declspec(dllexport) UnmanagedClass* GetInstance()
{
return new UnmanagedClass();
}
当我打电话从C#示例的someMethod我得到的错误在C++/CLI的dll! (我包括在C sharp项目中添加参考的C++/cli dll并创建包装对象)
谢谢你的帮忙!
迎接
'有必要对非托管类型或其他东西进行编组?'我们如何知道何时不显示'UnmanagedClass'或'Wrapper'的定义? (顺便说一下,'m_object->〜UnmanagedClass();'看起来绝对错误。) – ildjarn 2011-05-26 08:02:16
我不认为这是错误的(请阅读http://ondotnet.com/lpt/a/4731 - >我写封装本教程) – leon22 2011-05-26 08:04:56
@ leon22:同样,我们无法确定,因为我们看不到'UnmanagedClass'和'Wrapper'的定义。 – ildjarn 2011-05-26 08:06:06