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

标签 c# dll c++-cli unmanaged managed

我已经为 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/

相关文章:

c# - linq to entities 无法将 int 转换为字符串

c# - 无法在 memcached 中存储复杂对象

c# - Intranet - Web 到远程 wcf CredentialCache.DefaultNetworkCredentials 不起作用

c# - 从相对路径加载c#中的dll

c# - 混合程序集未发现 native DLL

c++ - 完成IWavePlayer NAudio c++

c# - C++/CLI 比 C# 快吗

c# - 在类库中包含 View

c++ - 两个线程可以调用同一个 DLL 中的两个函数吗?

c++ - DLL_PROCESS_ATTACH 无法在 Windows 7 C++ 上执行