Pregunta

Tengo una colección de terceros de archivos .h junto con los archivos .lib que los acompañan. Estoy envolviendo esos archivos nativos de C ++ con un contenedor C ++ / CLI y haciendo llamadas finales desde C #. Tengo un problema cuando llamo a métodos que esperan que se pase una referencia donde el valor no se cambia en mi contenedor a menos que lo cambie explícitamente.

Mi código de envoltura de C ++ / CLI actualmente se ve así:

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;
};

Y el código C ++ nativo correspondiente se ve así:

bool get_testInt16(int16 &testInt16);

Me imagino que tiene que haber una mejor manera, ¿pero tal vez no? ¡Digamos que ESPERO que haya una mejor manera!

¿Fue útil?

Solución

Una opción sería hacer:

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

Por lo tanto, simplemente cree una variable nativa local y evite la gran conversión y el puntero .NET.

Otros consejos

cualquier razón por la que no esté utilizando punteros de fijación en lugar de GCHandle :: ToIntPtr (GCHandle :: Alloc (testInt16)). ToPointer () ?

También fijar el valor referenciado como esto es demasiado tarde.

Si la referencia es a un valor de pila, no es necesario, si es una referencia a un campo de instancia, entonces el código de llamada realmente debería anclar el objeto (aunque esta es una filtración desordenada de semánticas no administradas en el código administrado, al menos hace el comportamiento del método claro.

Dado que el parámetro ref es tan pequeño, tendría sentido evitar por completo toda la fijación y crear uno temporal en la pila, pasarlo a la función no administrada y luego volver a escribirlo en el original.

bool get_testInt16(int16% testInt16)
{
   int16 temp = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(temp);
   testInt16 = temp;
   return b;
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top