在非托管堆上分配ref类对象

时间:2011-05-18 19:12:56

标签: .net visual-c++ c++-cli interop legacy-code

如果我在C ++ / CLI中定义新的ref class,那么我可以将此类型用作标准的非托管类,如果是,那么ref关键字是否会改变数据类型的内存布局所有?

在我的例子中,有一个类在一个非常大的C ++应用程序中被遍地使用。我们称之为MyExampleThing

class MyExampleThing
{
    int a = 0;
    int b = 1;
}

我们正在考虑通过C ++ / CLI将更多.net框架组件慢慢集成到此应用程序中的可能性。如果我将此类移植到ref class,它(在正常情况下)是否继续在其他普通的非托管C ++代码中工作?或者我是否必须保持原样并编写ref class包装来处理.net互操作?

要明确:我知道我不能只将非托管指针传递给托管代码,我只是问我是否可以单独使用该类 管理或非管理。

value class是否也是如此?

同样重要的是:如果我可以在非托管堆上创建ref class es,那么内存布局是否与常规C ++类相同? (这个类的非托管版本得到字节序列化字节作为二进制数据。是的,我知道这样做的字节序问题,不,我没有做出那个决定。)

2 个答案:

答案 0 :(得分:1)

ref不是我熟悉的关键字,所以我要说明一点,并说它可能不受非托管C ++的支持

如果你有一个库的可重用类,我只需要在非托管C ++中创建它们,它们可以很容易地被托管代码导入和使用,并保持.NET组件和托管代码的分离。除了可以随时做一些事情的对象之外,首选解耦类和接口。

当您需要让一方与另一方通信时,您还可以制作在托管代码和非托管代码之间编组的包装器。我的经验仅限于将C#应用程序调用到C ++库中,我曾经使用CLI进行过实验,但我自己并没有发现它特别有用。

答案 1 :(得分:0)

可以为托管客户端和本机客户端编写混合模式DLL。看看http://msdn.microsoft.com/en-us/magazine/cc300632.aspx

我个人总是在C ++ / CLI中编写一个包装器,将C ++类暴露给C#。