Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli 导出使用托管句柄的类? 我试图在C++/CLI中创建.NET库中的本地包装器,以便常规C++代码可以使用它。对于本例,假设这是我试图包装的C代码: class Foo { public Bar GetBar() {...} public string SomeProperty { get; set; } } class Bar { public void Baz() {...} }_C++ Cli - Fatal编程技术网

C++ cli 导出使用托管句柄的类? 我试图在C++/CLI中创建.NET库中的本地包装器,以便常规C++代码可以使用它。对于本例,假设这是我试图包装的C代码: class Foo { public Bar GetBar() {...} public string SomeProperty { get; set; } } class Bar { public void Baz() {...} }

C++ cli 导出使用托管句柄的类? 我试图在C++/CLI中创建.NET库中的本地包装器,以便常规C++代码可以使用它。对于本例,假设这是我试图包装的C代码: class Foo { public Bar GetBar() {...} public string SomeProperty { get; set; } } class Bar { public void Baz() {...} },c++-cli,C++ Cli,我基本上是在C++/CLI dll项目中大致做到这一点: class __declspec(dllexport) NativeFoo { public: NativeBar GetBar(); std::string GetName(); void SetName(const std::string &value); private: Foo ^m_foo; }; class __declspec(dllexport) NativeBar {

我基本上是在C++/CLI dll项目中大致做到这一点:

class __declspec(dllexport) NativeFoo
{
public:
    NativeBar GetBar();
    std::string GetName();
    void SetName(const std::string &value);

private:
    Foo ^m_foo;
};

class __declspec(dllexport) NativeBar
{
    friend class NativeFoo;
public:
    void Baz();

private:
    Bar(Bar ^bar);

    Bar ^m_bar;
};

这样,C++库可以链接到这个,使用NATEVEFO,就像它是一个普通C++类。在内部,NativeFoo将转换参数以将实现传递给m_foo,将任何管理的内容封送回本机表示,并将其返回给调用方

但是,我遇到的问题是,我不能拥有非托管类的托管成员:

error C3265: cannot declare a managed 'm_bar' in an unmanaged 'NativeFoo'
类似地,我不能将NativeFoo标记为ref本身是托管类,因为这样我就无法导出它:

C3386: 'NativeFoo' : __declspec(dllexport)/__declspec(dllimport) cannot be applied to a managed type
< >在C++对象中使用托管指针的正确方法是什么?

您需要使用GCROOT来声明非托管类型的托管句柄。对于任何非托管类型,无论是否为dllexported,都需要此选项

上面有一个很好的信息和一些样品

我相信你最终会得到这样的结果:

class __declspec(dllexport) NativeFoo
{
public:
    NativeBar GetBar();
    std::string GetName();
    void SetName(const std::string &value);

private:
    gcroot<Foo^> m_foo;
};
您需要使用gcroot在非托管类型上声明托管句柄。对于任何非托管类型,无论是否为dllexported,都需要此选项

上面有一个很好的信息和一些样品

我相信你最终会得到这样的结果:

class __declspec(dllexport) NativeFoo
{
public:
    NativeBar GetBar();
    std::string GetName();
    void SetName(const std::string &value);

private:
    gcroot<Foo^> m_foo;
};

您可以使用uu declspecdllexport而不是类导出托管函数。一般来说,你忽略了一个鸡和蛋的问题。必须有人加载CLR,这样托管代码才能执行。dllexport指令创建一个存根来处理这个问题。但这并不理想。您首先需要决定是创建一个容易调用本机代码的托管程序,还是创建一个难执行托管代码的本机程序。您可以使用_declspecdllexport而不是类导出托管函数。一般来说,你忽略了一个鸡和蛋的问题。必须有人加载CLR,这样托管代码才能执行。dllexport指令创建一个存根来处理这个问题。但这并不理想。您首先需要决定是创建一个容易调用本机代码的托管程序,还是创建一个难执行托管代码的本机程序。回答得好。我从gcroot开始,后来发现了autogcroot。i、 e.msclr::auto_gcroot m_foo;记住把这个和include一起使用。回答得好。我从gcroot开始,后来发现了autogcroot。i、 e.msclr::auto_gcroot m_foo;记住,将此与include一起使用。