.net f# marshalling

.net - usando Marshaller personalizado en F#



marshalling (1)

Al mirar el código del compilador , parece que el equipo de F # no pudo decidirse sobre esto:

| 0x2C -> error(Error(FSComp.SR.ilCustomMarshallersCannotBeUsedInFSharp(),m)) (* ILNativeType.Custom of bytes * string * string * bytes (* GUID,nativeTypeName,custMarshallerName,cookieString *) *) //ILNativeType.Error

No hay historia en torno a ese fragmento de código en github. Mi intuición es que la explicación sería algo así como "caso de uso poco común con una solución económica". Es muy probable que haya sido así desde el principio, ya que la especificación F # 2.0 también tiene la línea que citó.

Trata de plantear un problema en github al respecto. Quizás alguien allí pueda desenterrar algo en los sistemas de Microsoft.

He estado jugando con la clasificación en F # recientemente, y para mi sorpresa terminé con el error FS0980: los marshallers personalizados no se pueden especificar en el código F #. Considere usar una función auxiliar C #.

Solo la información sobre el tema, que logré encontrar, es la especificación F # 4.0 (página 300)

Cuando se aplica a un parámetro o tipo de retorno, especifica el atributo de clasificación para una declaración de apéndice CLI P / Invoke. Este atributo se puede usar tanto en F # como en ensamblados importados. Sin embargo, F # no es compatible con la especificación de Marshallers "personalizados".

Estoy muy interesado en las razones detrás de la falta de compatibilidad con Marshallers personalizados, ya que puedo "vivir con" la introducción del ensamblaje de C # para proyectar.

¿Alguien puede aclarar sobre esto?

EDITAR:

Código de muestra como solicitado

[<StructLayout(LayoutKind.Sequential, Pack=1)>] type BASIC_STRUCT = struct [<MarshalAsAttribute(UnmanagedType.CustomMarshaler,MarshalTypeRef=typedefof<DateTimeMarshaller>)>] val timeVar:DWORD end

de lo que noté solo configurando UnmanagedType.CustomMarshaler es suficiente para causar una excepción de tiempo de compilación