【发布时间】:2018-05-12 02:21:54
【问题描述】:
我在 Visual Studio 上使用 .Net Framework (VB.NET) 开发了一个新的(小)类,并参考了 VBA-Excel 来执行任务。它在我的机器上运行良好,所以这里真正的问题是在客户端机器上部署这个类。
当我在 Visual Studio 上进行构建时,我选择了"Register for COM Interop",因此它创建了一个 .dll 和 .tbs 文件。我以为我可以在 VBA 上使用对这些文件的引用,一切都会正常工作,但这并不是那么简单。我必须先在系统上注册 dll,然后才能使用它,Visual Studio 会在构建时自动完成。
问题是,如何制作一个通用的安装程序,只将那些 dll 和 tbl 文件安装到任何人的机器中?这些文件必须保留在已知文件夹中,以便我可以在 VBA 上引用它们,但 Windows 寄存器必须知道它们存在!
到目前为止我知道什么:
在构建时,Visual Studio 使用 Regasm.exe 注册 dll;一世 可以使用 bat 文件来调用 regasm.exe,但这不是一个选项 因为我必须参考它,每个客户都可以 有不同的 .Net Framework 版本,所以我无法知道 它的完整路径。
regsvr32.exe 也不起作用,因为我们需要管理员权限,并且
客户没有。我可以使用 ClickOnce,但它是一个类库,所以发布选项 不存在。
这里我有一些参考,但我还没有找到好的解决方案。
https://www.red-gate.com/simple-talk/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/
更新 1
似乎在注册表中安装的唯一方法是通过 regasm.exe 或 regsvr32,并且它们都需要提升的命令提示符(具有管理员权限),这是客户端没有的。
我想解决方案是使用 COM 组件的免注册激活,它不需要更新注册表或将程序集放入 GAC。以下是参考:
Is it possible to register a .NET assembly for COM interop without adding registry entries?
更新 2
我找到了这个答案,我能感觉到我真的很接近解决方案:
Registering .Net COM DLLs without Admin rights / regasm
问题是,我开发的类正在使用另一个类,即 PdfSharp。当我取消注册 dll 并尝试再次注册(通过 regasm.exe)时,我的 VBA 宏不是在我创建对象时给出错误,而是在我执行类的函数时,说 PdfSharp 不能找不到。
这个问题的解决方案并没有说明使用 3rd 方库,我认为我的 .dll 也会带来 pdfsharp.dll。
有什么想法吗?我真的很接近解决这个问题。
【问题讨论】:
-
我建议你将你的.net框架版本.dll放入安装目录并运行RegAsm进行注册
-
您好,峰峰!在提示中使用 RegAsm 不是一个选项,因为我不知道客户端的 .Net 框架的版本来获取其 RegAsm 完整路径。我正在寻找一种通过设置来做到这一点的方法,不知何故。一个安装 DLL 的简单安装程序,通过 Visual Studio 创建
-
更正:文件扩展名不是tbs,而是.tlb(类型库)
-
查看此博客:hanselman.com/blog/…
-
这似乎是一个很好的解决方法。我将尝试创建一个新项目(控制台应用程序,也许...一个我可以使用 ClickOnce 发布的项目)并在其中包含我的类,并选中“Register for COM Interop”,希望 dll 的注册采取放置在安装时,而不是构建时。我会尝试一下,稍后在此处设置结果。谢谢!
标签: c# .net vba dll deployment