1

我有一个 .h 文件的第 3 方集合以及随附的 .lib 文件。我正在使用 C++/CLI 包装器包装这些本机 C++ 文件,并从 C# 进行最终调用。当我调用期望传递引用的方法时,我遇到了一个问题,除非我明确更改它,否则我的包装器中的值不会更改。

我的 C++/CLI 包装器代码当前如下所示:

bool get_testInt16(int16% testInt16)
{
   int16* t = static_cast<int16*>(GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer());
   bool b = m_NativeCMTY_TestData->get_testInt16(*t);
   testInt16 = *t;
   return b;
};

相应的本机 C++ 代码如下所示:

bool get_testInt16(int16 &testInt16);

我认为必须有更好的方法,但也许不是?让我说我希望有更好的方法!

4

2 回答 2

4

一种选择是:

bool get_testInt16(int16% testInt16)
{
   int16 t = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(t);
   testInt16 = t;
   return b;
};

因此,您只需创建一个本地本机变量并避免巨大的强制转换和 .NET 指针的东西。

于 2009-08-03T16:36:49.543 回答
0

你有什么理由不使用固定指针而不是GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer()

像这样固定引用值也为时已晚。

如果引用是对堆栈值的引用,则不需要它,如果它是对实例字段的引用,则调用代码应该真正固定对象(尽管这是非托管语义的混乱泄漏到托管代码中,但它至少使行为方法清楚。

由于 ref 参数非常小,因此完全避免所有固定并在堆栈上创建一个临时参数,将其传递给非托管函数,然后将其写回原始函数是有意义的。

bool get_testInt16(int16% testInt16)
{
   int16 temp = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(temp);
   testInt16 = temp;
   return b;
};
于 2009-08-03T16:40:20.147 回答