如何在不注册DLL的情况下将面向对象的库公开给excel?

时间:2016-09-12 21:44:53

标签: c# c++ vb.net excel excel-vba vba

我正在开发一个面向对象的C ++库,我希望在Excel中向用户公开一些功能。理想情况下,我想在Excel VB中使用该库,并提供一些我可以通过电子表格公开的更高级别的函数。

我为C ++库编写了一个C-API,但它很难用作对象需要显式的create / dispose调用。

使用C-API,我构建了一个Python API,其中create-dispose调用由Python类处理。 Python API可用于构建更高级别的函数,并通过IPython笔记本将它们公开给用户。可以将IPython笔记本配置为加载Python模块并指定加载DLL的路径,而无需管理员权限:

import sys sys.path.insert(0,notebook_directory) import mylib mylib.Config_library_path(notebook_directory) #Used for DLL loading by ctypes

这意味着我可以将笔记本分发为自包含的实体。 我需要对Excel文档和我随其分发的一些DLL做同样的事情。

我可以像在Python中一样编写围绕C-API的C#绑定,但是我看不到如何在没有全局DLL注册的情况下将C#DLL加载到Excel中。

我可以使用C-API在VB中创建XLL和Declare函数,但这意味着我必须在Excel VB中处理内存管理。

有哪些选项可用于创建自包含的Excel工具,就像我为IPython笔记本所做的那样?

1 个答案:

答案 0 :(得分:1)

你问一个关于复杂决策树的模糊问题:

  1. 如何将C库公开给Excel。您有两种选择,可以是工作表函数和宏,也可以是VBA环境。
  2. 对于工作表函数,您可以使用一个或多个C / C ++工具包制作一个xll,例如: XLW或XLL +,或.NET包装器和Excel-DNA,或Python和PyXLL。
  3. 对于VBA集成,您必须公开通过VBA中的Declare语句使用的平面C API,或者公开COM库。
  4. COM库可以用C ++或.NET编写。
  5. 如果您自己负责注册,则可以注册并加载COM库,仅使用用户权限。 Excel-DNA对从Excel-DNA加载项公开的COM类进行此类非管理员注册。但是这可以在任何COM库中完成。
  6. 你应该这样做:

    1. 编写VBA声明直接引用您的C API,即使正确使用会有点尴尬。使用LoadLibrary确保.dll相对于工作簿位置加载。
    2. 创建一些包含这些C调用的高级VBA辅助类。
    3. 将其作为.xlam加载项发送。