运行 Excel DNA FSharp 注册样本时出现 DnaMarshalException

DnaMarshalException when running Excel DNA FSharp Registration Sample

我正在尝试按照 the sample project 使用 Excel-F Sharp 的 DNA 注册助手。特别是,我对使用可选参数的示例感兴趣。

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

Registration [Error] Method not registered due to unsupported signature: 'Func`4.Invoke' : DnaMarshalException - Unknown Data Type: Microsoft.FSharp.Core.FSharpOption`1[System.Double]

在诊断 window 中,功能 dnaFSharpOptional 在 Excel 中不可用。就好像参数转换 FsParameterConversions.FsOptionalParameterConversion 没有被应用或没有按预期工作。

关于错误的来源以及如何解决它的任何想法?

N.B.

  1. 由于我只构建示例项目,而不是整个 Excel-DNA 注册解决方案,我不得不更改一些项目引用(即 ExcelDna.Registration、[=35= .FSharp) 以指向来自 nuget 的预构建程序集。但我不认为这会有所作为。
  2. 示例项目在项目调试设置中引用 Excel 2013,但我使用的是 Excel 2010。
  3. 项目中的其他示例函数(即 Async 函数)可用,因此通常不是注册失败的情况 - 它是可选参数特定的。

看起来问题在于过滤器应用于参数转换 FsParameterConversions.FsOptionalParameterConversion,它仅匹配 obj 类型的参数(即 System.Object)。

我的fix/workaround是修改FsAsync.Addin.AutoOpen方法来调用ParameterConversionConfiguration.AddParameterConversion的不同重载,将null传递给第二个参数。这会强制转换匹配所有参数,无论类型如何。

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

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

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

至:

let paramConvertConfig = ParameterConversionConfiguration()
                            .AddParameterConversion(
                                new Func<Type, ExcelParameterRegistration, LambdaExpression>(
                                    FsParameterConversions.FsOptionalParameterConversion),
                                null) // null forces the parameter conversion to be tried against all params