通过从C#和C ++基准通行更好的办法?
-
11-07-2019 - |
题
我的.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;
};
不隶属于 StackOverflow