我的.h文件第三方收集与他们一起去.lib文件一起。我的包裹本地C ++文件用C ++ / CLI的包装,使从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);

我想,有一定有一个更好的办法,但也许不是?让只说我希望有一个更好的办法!

有帮助吗?

解决方案

这是选择是要做到:

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

所以,你只需创建一个本地本地变量,避免庞大的演员和.NET指针的东西。

其他提示

任何理由你不使用钉住指针,而不是GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer()

另外钉扎的参考价值这样为时已晚。

如果所指的是一个堆栈的值是不必要的,如果是一个实例字段的引用然后调用代码应该真正针物体(虽然这是非托管semntics的凌乱泄漏到至少品牌托管代码它该方法明确的行为。

由于ref参数是如此之小,这将是有意义的只是避免所有的完全钉扎和在栈上创建的临时之一,传递通过对非托管函数,然后将它写回原来的。

bool get_testInt16(int16% testInt16)
{
   int16 temp = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(temp);
   testInt16 = temp;
   return b;
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top