.net 运行Excel DNA FSharp注册样本时出现异常

.net 运行Excel DNA FSharp注册样本时出现异常,.net,f#,excel-dna,.net,F#,Excel Dna,我正在尝试使用Excel DNA注册助手来帮助F Sharp。特别是,我对使用可选参数的示例感兴趣 我已经构建了示例项目(使用Visual Studio 2015),但是当我将生成的Xll加载到Excel 2010中时,我收到了错误 注册[Error]方法未注册,因为不支持签名:“Func`4.Invoke”:DnaMarshalException-未知数据类型:Microsoft.FSharp.Core.FSharpOption`1[System.Double] 在诊断窗口中,函数dnaFSh

我正在尝试使用Excel DNA注册助手来帮助F Sharp。特别是,我对使用可选参数的示例感兴趣

我已经构建了示例项目(使用Visual Studio 2015),但是当我将生成的Xll加载到Excel 2010中时,我收到了错误

注册[Error]方法未注册,因为不支持签名:“Func`4.Invoke”:DnaMarshalException-未知数据类型:Microsoft.FSharp.Core.FSharpOption`1[System.Double]

在诊断窗口中,函数
dnaFSharpOptional
在Excel中不可用。这就好像参数转换
FsParameterConversions.FsOptionalParameterConversion
未被应用或未按预期工作

有没有关于错误来源的想法,以及如何修复它

注意

  • 由于我只是构建示例项目,而不是整个Excel DNA注册解决方案,所以我不得不更改一些项目引用(即ExcelDna.Registration、ExcelDna.Registration.FSharp)以指向nuget中的预构建程序集。但我不认为这会有什么不同
  • 示例项目在项目调试设置中引用了Excel 2013,但我使用的是Excel 2010
  • 项目中的其他示例函数(即异步函数)都是可用的,因此通常不会出现注册失败的情况-这是可选参数特有的情况

  • 问题似乎是将筛选器应用于参数转换
    FsParameterConversions.FsOptionalParameterConversion
    ,其中它仅与类型为
    obj
    (即
    System.Object
    )的参数匹配

    我的修复/解决方法是修改
    FsAsync.Addin.AutoOpen
    方法,调用
    ParameterConversionConfiguration.AddParameterConversion
    的不同重载,将
    null
    传递给第二个参数。这将强制转换与所有参数匹配,而不考虑类型

    奇怪的是,在调用此重载时,我还必须显式地将参数转换对象转换为委托类型,以便对其进行编译(不确定原因)

    将ExampleAddIn.fs的第10-11行更改为:

    let paramConvertConfig = ParameterConversionConfiguration()
                                 .AddParameterConversion(FsParameterConversions.FsOptionalParameterConversion)
    
    致:

    let paramConvertConfig=ParameterConversionConfiguration()
    .AddParameterConversion(
    新职能(
    FsParameterConversions.FsOptionalParameterConversion),
    null)//null强制对所有参数进行参数转换
    
    我创建了一个问题来跟踪此错误:
    let paramConvertConfig = ParameterConversionConfiguration()
                                .AddParameterConversion(
                                    new Func<Type, ExcelParameterRegistration, LambdaExpression>(
                                        FsParameterConversions.FsOptionalParameterConversion),
                                    null) // null forces the parameter conversion to be tried against all params