Как сделать функции ExcelDna из пакета Nuget.org видимыми в сеансе Excel пользователя пакета - PullRequest
1 голос
/ 19 июня 2020

Я создал пакет Nuget.org со следующим (сокращенным) кодом:

namespace MyNugetPackageNS
    module MyNugetModule = 
        open ExcelDna.Integration

        // this function is NOT seen in the package user's Excel session
        [<ExcelFunction(Category="Test", Description="Add 1.")>]
        let plusOne ([<ExcelArgument(Description= "Value.")>] value: double) : obj = 
            value + 1.0 |> box

Я надеялся, что если пользователь установит пакет и добавит его в свою собственную библиотеку, все файлы Excel функции, определенные в пакете (например, plusOne), будут автоматически отображаться в Excel, но это не так. Кажется, что пользователь должен «обернуть» пакетные функции Excel, чтобы сделать их видимыми в Excel, например:

namespace UserNS
    module UserModule = 
        // need to install the nuget package from Nuget.org
        open MyNugetPackageNS.MyNugetModule
        open ExcelDna.Integration

        // this function is seen in the package user's Excel session
        [<ExcelFunction(Category="Test", Description="Add 1.")>]
        let plusOne2 ([<ExcelArgument(Description= "Value.")>] value: double) : obj = 
            MyNugetModule.plusOne value

Мой вопрос: есть ли способ автоматически «сделать видимыми функции Excel пакета» "в сеансе Excel пользователя пакета, без предварительной упаковки каждой функции?

=================

EDIT:

Следуя совету Аугусто, я добавил пакет регистрации Excel-ДНК в свой проект Nuget и на основе примеров, найденных здесь , добавил фрагмент MakeAddInsVisible, который явно загружает функции Excel проекта Nuget.

namespace MyNugetPackageNS
open ExcelDna.Integration
open ExcelDna.Registration

type MakeAddInsVisible () =
    interface IExcelAddIn with
        member this.AutoOpen ()  = 
            ExcelRegistration.GetExcelFunctions ()
            |> ExcelRegistration.RegisterFunctions
        member this.AutoClose () = ()

    module MyNugetModule = 
        open ExcelDna.Integration

        // this function is STILL NOT seen in the package user's Excel session
        [<ExcelFunction(Category="Test", Description="Add 1.")>]
        let plusOne ([<ExcelArgument(Description= "Value.")>] value: double) : obj = 
            value + 1.0 |> box

Я также добавил флаг ExplicitRegistration в файл .dna моего проекта Nuget:

<DnaLibrary Name="MyNugetPackageNS Add-In" RuntimeVersion="v4.0" xmlns="http://schemas.excel-dna.net/addin/2018/05/dnalibrary">
  <ExternalLibrary Path="MyNugetPackageNS.dll" ExplicitExports="true" ExplicitRegistration="true" LoadFromBytes="true" Pack="true" IncludePdb="false" />
</DnaLibrary>

«Локально» (то есть, когда я использую MyNugetPackageNS как обычный пакет, прежде чем экспортировать его в Nuget.org), похоже, это работает так, как ожидалось: из-за флага ExplicitRegistration="true" в файле .dna функции Excel по-прежнему регистрируются из-за наличия фрагмента MakeAddInsVisible (и функция Excel не будет зарегистрирована, когда фрагмент закомментирован).

Теперь я экспортировал этот новый код на nuget.org и загрузил пакет в проект пользователя пакета nuget (без каких-либо изменений в приведенном выше коде namespace UserNS ...).

К сожалению MyNugetPackageNS Функции Excel по-прежнему невидимы из сеанса Excel пользователя пакета nuget.

Что я пропустил?

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Дополнительная библиотека, которую вы добавляете в свой пользовательский проект, не будет распознана при запуске Excel-DNA без каких-либо указаний на то, что эту библиотеку следует сканировать на наличие функций Excel.

Один из способов, которым ваш пользователь может указать, что ваша библиотека должна быть проверена (и зарегистрированы функции), чтобы они добавили запись <ExternalLibrary> в свой файл .dna надстройки.

Другой подход - это то, что описывает Augusto, где ваш пользователь может добавить некоторый код в их надстройку, чтобы зарегистрировать функцию. Но код будет в их проекте. Если код находится в библиотеке, которую вы предоставляете через NuGet, что-то еще должно запускать этот код для запуска, например, какой-то другой вызов регистрации из библиотеки пользователя.

1 голос
/ 19 июня 2020

Чтобы зарегистрировать новые функции во время выполнения, вам нужно будет использовать расширение регистрации . Вот пример того, как его использовать:

{ ссылка }

0 голосов
/ 21 июня 2020

Следуя первому предложению Говерта, я добавил <ExternalLibrary Path="MyNugetPackageNS.dll" ExplicitExports="true" ExplicitRegistration="true" LoadFromBytes="false" Pack="false" IncludePdb="false" /> в файл .dna пользователя пакета, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...