2016-08-01 39 views
2

我正在嘗試使用the sample project來爲F Sharp使用Excel-DNA註冊助手。特別是,我對使用可選參數的示例感興趣。運行Excel DNA FSharp時發生DnaMarshalException註冊示例

我已經建立了示例項目(使用Visual Studio 2015年),但是當我得到的XLL加載到Excel 2010中收到錯誤

註冊[錯誤]方法沒有登記,由於不支持的簽名: 'Func`4.Invoke':DnaMarshalException - 未知數據類型:Microsoft.FSharp.Core.FSharpOption`1 [System.Double]

在診斷窗口,並且功能dnaFSharpOptional是不可用在Excel中。就好像參數轉換FsParameterConversions.FsOptionalParameterConversion沒有被應用或者沒有按預期工作。

任何想法的錯誤的來源,以及如何解決它?

N.B.

  1. 由於我只建立示例項目,而不是整個Excel的DNA註冊的解決方案,我不得不改變一些項目引用(即ExcelDna.Registration,ExcelDna.Registration.FSharp)的指向來自nuget的預製組件。但我不認爲這會有所作爲。
  2. 示例項目在項目中引用Excel 2013調試設置,但我使用的是Excel 2010.
  3. 項目中的其他示例函數(即異步函數)可用,所以它不是一般的註冊失敗 - 這是可選參數特有的東西。
+0

我創建了一個問題跟蹤此錯誤:https://github.com/Excel -DNA /註冊/問題/ 8 – Govert

回答

2

貌似問題是,一個過濾器被應用到參數轉換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(
           new Func<Type, ExcelParameterRegistration, LambdaExpression>(
            FsParameterConversions.FsOptionalParameterConversion), 
           null) // null forces the parameter conversion to be tried against all params