如何使来自 Nuget.org 包的 ExcelDna 函数在包用户的 Excel 会话中可见

How to make ExcelDna functions from Nuget.org package visible in the package user's Excel session

我创建了一个 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 中可见,但事实并非如此。似乎用户必须 "wrap" 包 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 会话中自动 "visible",而无需事先包装每个函数?

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

编辑:

根据 Augusto 的提示,我将 Excel-DNA Registration 包添加到我的 Nuget 项目中,并根据找到的示例 here,我添加了 MakeAddInsVisible 片段,它显式加载了Nuget 项目的 Excel 函数。

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

我还在我的 Nuget 项目的 .dna 文件中添加了 ExplicitRegistration 标志:

<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>

"Locally"(意思是当我将 MyNugetPackageNS 用作普通包时,在将其导出到 Nuget.org 之前),这似乎按预期工作:因为 ExplicitRegistration="true" 标志在.dna 文件中,Excel 函数仍然被注册,因为存在 MakeAddInsVisible 代码片段(并且当代码片段被注释掉时,不会注册任何 Excel 函数)。

现在我将这个新代码导出到 nuget.org 并将包下载到 nuget 包用户的项目中(没有对上面的 namespace UserNS ... 代码进行任何修改)。

不幸的是,MyNugetPackageNS Excel 函数在 nuget 包用户的 Excel 会话中仍然不可见。

我错过了什么?

为了在 运行 时注册新功能,您必须使用 Registration extension。这是一个如何使用它的例子:

您添加到用户项目的额外库将不会被 Excel-DNA 启动识别,除非有一些迹象表明应该扫描该库以获取 Excel 函数。

您的用户可以指示应检查您的库(以及注册的函数)的一种方法是让他们在他们的加载项 .dna 文件中添加一个 <ExternalLibrary> 条目。

Augusto 描述了另一种方法,您的用户可以在其加载项中添加一些代码以注册该功能。但是代码将在他们的项目中。如果代码在您通过 NuGet 提供的库中,某些东西仍必须将此代码触发到 运行,例如来自用户图书馆的一些其他注册电话。

按照 Govert 的第一个建议,我将 <ExternalLibrary Path="MyNugetPackageNS.dll" ExplicitExports="true" ExplicitRegistration="true" LoadFromBytes="false" Pack="false" IncludePdb="false" /> 添加到包用户的 .dna 文件中,它起作用了。