我已經爲原生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