加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c -cli – 使用C/C++LI捕获非托管类的返回类型

发布时间:2020-12-16 06:57:12 所属栏目:百科 来源:网络整理
导读:我在我的原生dll中有一个方法,我想使用它.该方法返回一个类型的对象,该对象也在我的本机dll中.我正在尝试编写一个c / CLI包装器. 现在, 我可以使用C/C++LI获取返回值作为对象吗?我该怎么做? 我们可以存储和传递本机C对象吗? 我是否需要创建类似本机C类的
我在我的原生dll中有一个方法,我想使用它.该方法返回一个类型的对象,该对象也在我的本机dll中.我正在尝试编写一个c / CLI包装器.

现在,

>我可以使用C/C++LI获取返回值作为对象吗?我该怎么做?
>我们可以存储和传递本机C对象吗?
>我是否需要创建类似本机C类的类?
>我将如何整理课程?

例如,我的本机dll有这些类,

class X
{
    /* some props and methods. */
};


Class Y
{
    X* someMethod();
};

我需要使用C/C++LI包装someMethod类.我能在CLI中获得返回值吗?

解决方法

从DLL中的导出函数返回指向C对象的指针是一个非常糟糕的主意.这是一个令人讨厌的内存管理问题,您希望客户端代码释放该对象.只有当两个DLL使用完全相同版本的CRT(/ MD编译选项)的DLL版本时,才能达到目的.如果您无法重新编译本机DLL,那么现在停止,您无法使其可靠地工作,或者您将来会遇到很大的维护问题.

Anyhoo,你需要两个类的包装器.他们应该像这样:

#pragma managed(push,off)
#include "xandy.h"
#pragma managed(pop)

using namespace System;

namespace something {

    public ref class XWrapper {
        X* mX;
    public:
        XWrapper(X* obj) : mX(obj) {}
        ~XWrapper() { this->!XWrapper(); }
        !XWrapper() {
            // Trouble is here!!!
            delete mX;
        }
    };

    public ref class YWrapper {
        Y* mY;
    public:
        YWrapper() { mY = new Y; }
        ~YWrapper() { this->!YWrapper(); }
        !YWrapper() { delete mY; }
        XWrapper^ someMethod() {
            return gcnew XWrapper(mY->someMethod());
        }
    };
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读