我有以下情况。托管代码将初始化很多类的对象,这是一个非托管结构的包装。我可以为此做两种方法。一个是拥有一个托管类包装器,它只有一个指向非托管对象的指针。另一个是拥有一个完整的托管类,并在需要调用非托管方法时创建非托管对象。我提供了以下两种方法。有人告诉我,如果我使用方法1(有一个指向无人管理对象的指针),GC将会有很多问题知道非托管部分,最好采取方法2。有人告诉我哪个更好,或者如果有是另一种更好的方法。我对方法2的关注是,每次调用非托管方法时都会复制。我不确定GC问题是否胜过它。高效地调用非托管方法将非托管对象作为托管代码的参数
编辑 - 第一种方法有一个ref类,第二种方法有一个值类。究其原因,第二个是值,使得其可以更有效地
添加到列表在非托管:
struct A_UNMANAGED
{
int a;
int b[20];
};
void GetData(A_UNMANAGED& a); // populates A
在管理(第一种方法)
public ref class A_MANAGED
{
A_UNMANGED* ap;
public:
property System::UInt32 a
{
System::UInt32 get() { return ap->a; }
void set(System::UInt32 value) { ap->a = value; }
}
property array<System::UInt32>^ b
{
array<System::UInt32>^ get() { return ap->b; }
void set(array<System::UInt32>^ value) { b = value; } // assume this copy works
}
internal:
void GetData()
{
GetData(ap);
}
};
在托管(第二种方法)(编辑:更新为参考假设所有垃圾收集和指针创建写入正确)
public value class A_MANAGED
{
System::UInt32 a;
array<System::UInt32>^ b;
public:
property System::UInt32 a
{
System::UInt32 get() { return a; }
void set(System::UInt32 value) { a = value; }
}
property array<System::UInt32>^ b
{
array<System::UInt32>^ get() { return b; }
void set(array<System::UInt32>^ value) { b = value; }
}
internal:
void GetUnmanaged(A_UNMANAGED& obj1)
{
obj1.a = a;
pin_ptr<System::UInt32> bp = &b[0];
memcpy(obj1.b, bp, 20);
}
void GetData()
{
A_UNMANAGED obj2;
GetUnmanaged(obj2);
GetData(obj2);
// copy from obj2 to member variables
}
};
我打算标记第一级参考。我确实有析构函数和终结器,但没有写在这里。也正如我所指定的假设b副本的作品。我的问题是要知道哪种方法更好,如果GC和价值问题是真的 – 2011-04-14 01:07:31
那么,你通过发布蹩脚的代码浪费了我的时间。这么做的意义何在?它不会改变我的答案。 – 2011-04-14 01:10:28