【问题标题】:How to deploy Class Library (dll or tbl file) with Installer如何使用安装程序部署类库(dll 或 tbl 文件)
【发布时间】: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/

https://social.msdn.microsoft.com/Forums/windows/en-US/70f5558c-cf53-4bc0-b3ea-435b6f5b3956/how-to-get-setup-project-to-register-assembly-for-com-interop?forum=winformssetup

https://social.msdn.microsoft.com/Forums/en-US/47d6dc58-37ce-4a34-9524-20dc1c1ffd90/how-to-use-clickonce-deployment-technology-for-class-library-project?forum=winformssetup

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


【解决方案1】:

您是否尝试过使用 Install Shield Limited Edition 来打包您的应用程序?它是免费的。

【讨论】:

  • 我用的是Visual Studio 2017,这个版本的Install Shield LE好像已经不可用了=/
  • @RafaelPacheco 您必须在 2015 年及更新版本手动安装插件marketplace.visualstudio.com/…
  • 我已经安装了插件,但我无法让它工作。我试图将程序集添加到向导设置中,但它只是解压缩了我添加的文件,并且还提出了管理员权限请求,这是我必须避免的。您能否帮助我了解如何通过安装向导安装 DLL?
【解决方案2】:

我放弃了在没有管理员权限的机器上安装 DLL 的尝试,所以我在 Visual Studio 上开发了一个控制台应用程序,并通过 VBA 上的 Shell 命令运行它,它就像一个魅力。

我会将此设置为正确答案,因为它解决了我的问题,但我找不到通过安装程序在其他机器上部署 dll 的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多