2010-05-31 6 views
9

Estoy intentando llamar a un método escrito en C++/CLI desde C#. El código C++/CLI se utiliza para actualizar una columna TIMESTAMP en una base de datos Oracle, con un ID de registro y el objeto System::DateTime, que es el tipo de datos compatible con .NET para el tipo TIMESTAMP de Oracle.Llamando al método C++/CLI con sistema :: ¿El parámetro DateTime requiere 'ValueType' como parámetro?

El método que yo estoy llamando tiene el siguiente prototipo:

bool ChangeJobUpdateDate (int jobIdIn, System::DateTime^ updateDateIn) 

He añadido una referencia a este proyecto DLL en un proyecto de prueba que hice; Estoy escribiendo las pruebas en C#. Sin embargo, cuando trato de llamar a este método desde el proyecto de prueba de la unidad C#, la función parece tener la siguiente declaración de método (a través de IntelliSense):

bool ChangeJobUpdateDate (int jobIdIn, ValueType updateDateIn) 

que es cierto que no soy tan familiarizados con C++/CLI, por lo ¿Se me escapa algo?

Respuesta

11

Sospecho que es porque estás usando DateTime^ en lugar de solo DateTime. Es un tipo de valor, entonces ¿por qué estás tratando de usar una referencia?

C# no tiene ninguna manera de representar el tipo de referencia en caja asociada a un tipo de valor, por lo que lo mejor que puede hacer es ValueType - Me sospechoso eso es lo que está pasando, aunque no puedo decir con seguridad debido a la mi falta de experiencia con C++. Pruebe solo DateTime y vea cómo se ve ...

+1

Eso fue todo! Parece que necesitaré pasar más tiempo leyendo sobre el significado de estos símbolos ^% & * ing. ¡Gracias! :) –

+3

Eso es más o menos. C++/CLI realmente codifica el tipo real del valor en la firma; en este caso, en IL, el tipo completo sería: 'clase [mscorlib] System.ValueType modopt ([mscorlib] System.DateTime) modopt ([mscorlib ] System.Runtime.CompilerServices.IsBoxed) '- que es como el compilador de C++/CLI sabe más tarde el tipo correcto y hará una correcta comprobación de tipos - pero C# simplemente ignora todos los' modospt' y los trata como un simple 'ValueType'. –

+0

@Pavel: Gracias por los detalles. Realmente estaba haciendo una conjetura educada. No dude en editar todo esto bondad en mi respuesta, o agregue la suya :) –

Cuestiones relacionadas