使用 C++/CLI 捕获非托管类的返回类型

发布于 2024-11-28 15:02:16 字数 430 浏览 4 评论 0原文

我的本机 dll 中有一个我想使用的方法。该方法返回一个类型的对象,该类型也在我的本机 dll 中。我正在尝试编写一个 C++/CLI 包装器。

现在,

  • 我可以使用 C++/CLI 获取返回值作为对象吗?我该怎么做?
  • 我们可以存储和传递本机 C++ 对象吗?
  • 我是否需要创建自己的类似于本机 C++ 类的类?
  • 我将如何编组班级?

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

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


Class Y
{
    X* someMethod();
};

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

I have a method in my native dll, that I want to use. The method returns an object of a type that is also in my native dll.I am trying to write a c++/CLI wrapper.

Now,

  • Can I get a return value as the object using C++/CLI and how do I do that?
  • Can we store and pass the native C++ object?
  • Should I need to create my own class resembling the native C++ class?
  • How would I marshal a class?

For Example,My native dll has these classes,

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


Class Y
{
    X* someMethod();
};

I need to wrap the someMethod class using C++/CLI. Will I be able to get the return value in the CLI?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃不饱 2024-12-05 15:02:16

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

不管怎样,你需要一个两个类的包装器。它们应该类似于这样:

#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());
        }
    };
}

Returning pointers to C++ objects from an exported function in a DLL is a pretty bad idea. It is a nasty memory management problem, you'd expect the client code to release the object. That can only come to a good end when both DLLs use the exact same version of the DLL version of the CRT (/MD compile option). If you can't recompile the native DLL then stop right now, you cannot make it work reliably or you'll have a big maintenance problem in the future.

Anyhoo, you need a wrapper for both classes. They should resemble this:

#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());
        }
    };
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文