gpt4 book ai didi

c# - native C++ dll 的 C++/CLI 包装器

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:26 26 4
gpt4 key购买 nike

我已经为 native 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 并创建了 Wrapper 对象)

感谢您的帮助!

问候

最佳答案

直接调用用(非放置)new分配的对象的析构函数是不合适的。尝试改变

m_object->~UnmanagedClass();

delete m_object;
m_object = 0;

(m_object = 0; 是必需的,因为与只能调用一次的 native C++ 类型的析构函数不同,托管类型的 Dispose 实现可能会被重复调用,并且这样做必须有明确的行为。)

或者,更好的是,除了公开一个 GetInstance 函数之外,还公开一个 DestroyInstance 函数并调用它而不是使用 delete 所以使用代码不需要依赖于 GetInstance 的实现细节(即,它使用 operator new 分配实例)。

关于c# - native C++ dll 的 C++/CLI 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6135391/

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