在F#中使用自定义Marshaller

时间:2016-03-20 21:15:57

标签: .net f# marshalling

我最近一直在玩F#中的编组,令我惊讶的是我最终得到了错误FS0980:无法在F#代码中指定自定义封送器。考虑使用C#辅助函数。

我设法找到的有关该主题的信息仅为F#4.0 Spec(第300页)

  

当应用于参数或返回类型时,   指定CLI的编组属性   P / Invoke存根声明。   此属性可以在F#和   进口组件。 但是,F#没有   支持" custom"   marshallers

我最感兴趣的是缺乏定制marshallers支持的原因,因为我可以"生活在"将C#程序集引入项目。

有人可以澄清这个吗?

修改

请求的示例代码

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

从我注意到只是设置 UnmanagedType.CustomMarshaler 就足以导致编译时异常

1 个答案:

答案 0 :(得分:2)

看看compiler code,F#团队似乎无法真正下定决心:

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

github上的那段代码没有历史记录。我的直觉是,解释将成为&#34;不常见的用例和廉价的解决方法&#34;。很可能它从一开始就是这样,因为F#2.0规范也有你引用的那条线。

尝试在github上提出一个问题。也许有人可以在微软系统中挖掘出一些东西。