如何使来自 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 文件中,它起作用了。
我创建了一个 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 文件中,它起作用了。