2016-08-01 6 views
2

Я пытаюсь следовать the sample project для использования помощников по регистрации Excel-DNA для F Sharp. В частности, меня интересует образец для использования необязательных аргументов.DnaMarshalException при запуске Excel DNA FSharp Пример регистрации

Я построил пример проекта (с использованием Visual Studio 2015), но когда я загрузить полученный Xll в Excel 2010 я получаю ошибку

Регистрация [Error] Метод не зарегистрирован из-за неподдерживаемого подписи: 'Func`4.Invoke': DnaMarshalException - Неизвестно Тип данных: Microsoft.FSharp.Core.FSharpOption`1 [System.Double]

в окне диагностики, а функция dnaFSharpOptional недоступна в Excel. Это как если бы преобразование параметров FsParameterConversions.FsOptionalParameterConversion не применялось или не работает должным образом.

Любые идеи об источнике ошибки и как это исправить?

N.B.

  1. Как я только строительство типового проекта, а не весь Excel-ДНК регистрация решения, мне пришлось изменить некоторые из ссылок проекта (а именно ExcelDna.Registration, ExcelDna.Registration.FSharp), чтобы указать предварительно собранные сборки из nuget. Но я не думаю, что это изменило бы ситуацию.
  2. Образец проекта ссылается на Excel 2013 в проекте Параметры отладки, но я использую Excel 2010.
  3. Другие примеры функций в проекте (то есть функции Async) доступны, так что это не случай регистрации, - это нечто специфическое для необязательных аргументов.
+0

Я создал проблему для отслеживания этой ошибки: https://github.com/Excel -ДНК/Регистрация/вопросы/8 – Govert

ответ

2

Похоже, проблема в том, что фильтр применяется к преобразованию FsParameterConversions.FsOptionalParameterConversion параметра, где он соответствует только против параметров типа obj (т.е. System.Object).

Мое исправление/обходное решение заключается в изменении метода FsAsync.Addin.AutoOpen для вызова другой перегрузки ParameterConversionConfiguration.AddParameterConversion, минуя null во второй аргумент. Это заставляет преобразование соответствовать всем параметрам, независимо от типа.

Как ни странно, я также должен был явно преобразовать объект преобразования параметров в тип делегата при вызове этой перегрузки, чтобы заставить его скомпилировать (не уверен, почему).

Изменение строки 10-11 из ExampleAddIn.fs от:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^