如果我在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 ++类相同? (这个类的非托管版本得到字节序列化字节作为二进制数据。是的,我知道这样做的字节序问题,不,我没有做出那个决定。)
答案 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#。