用于本机C ++ dll的C ++ / CLI包装器

|| 我已经为本地C ++ dll编写了C ++ / Cli包装器,但是当我从C#调用某些方法时,我的C ++ / Cli包装器dll中出现System.AccessViolationException错误!是否需要封送非托管类型或其他内容?!
// 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并创建了包装对象) 谢谢您的帮助! 打招呼     
已邀请:
直接调用分配了(非放置)
new
的对象的析构函数是不合适的。尝试改变
m_object->~UnmanagedClass();
delete m_object;
m_object = 0;
m_object = 0;
是必需的,因为与本机C ++类型的析构函数只能被调用一次不同,托管类型的
Dispose
实现可以被重复调用,并且这样做必须具有定义的行为。) 或者,更好的是,除了公开
GetInstance
函数之外,还公开
DestroyInstance
函数并调用该函数,而不是使用
delete
,以便使用代码无需依赖
GetInstance
的实现细节(即,它使用
operator new
分配其实例)。 )。     
我发现了错误(System.AccessViolationException): 我正在非托管代码中使用另一个对象,而没有初始化(空对象->仅声明)! 用new()初始化对象,所有对象都应正常运行!     

要回复问题请先登录注册