【问题标题】:COM access to VB.Net dll without strong name signingCOM 访问 VB.Net dll,无需强名称签名
【发布时间】:2012-01-27 22:19:20
【问题描述】:

我正在使用 Visual Studio 2008 Express 将 VB6 dll 转换为 VB.Net。我想使用相同的 .dll 通过 Excel-DNA 与 Excel 集成,但也可以通过 COM 使用(我需要能够从 VBScript 和 VBA 调用它)。

如果我让程序集未签名,我可以访问所有 ExcelDNA 功能,但不能访问 COM。

如果我使用强名称对程序集进行签名,那么当我尝试构建 .dll 时,我会收到以下错误:

无法发出程序集:引用的程序集“ExcelDna.Integration”没有强名称

我有什么选择?

【问题讨论】:

    标签: vb.net com strongname excel-dna


    【解决方案1】:

    您不必强命名 [ComVisible] 程序集。只有当您想在 GAC 中安装它时才需要它。不是绝对必要的,尽管与 DLL Hell 作斗争不是一个坏主意。您需要使用 /codebase 选项将其注册到 Regasm.exe。 Visual Studio 已经自动执行此操作,尽管 Express 版本中可能缺少该选项。

    解决第二个问题也不难。只需从源代码重建 Excel-DNA 解决方案即可download from Codeplex

    【讨论】:

      【解决方案2】:

      Excel-DNA 可以选择将您的 .NET 类直接公开给 COM,因此您可以直接从 VBA 将它们用作常规 COM 类。

      为此,您的类必须是 ComVisible(或整个程序集必须是 ComVisible),并且您必须在 .dna 文件中将 ExternalLibrary 标记为 ComServer='true',例如:

      <DnaLibrary RuntimeVersion='v4.0' />
        <ExternalLibrary Path='MyAddIn.dll' ComServer='true' />
      </DnaLibrary>
      

      然后您有一些注册选项: 要么调用“Regsvr32.exe MyAddInDna.xll” 或在加载项的 AutoOpen 中,调用 ExcelDna.Integration.ComServer.RegisterServer()

      这两个都设置了注册表项,以便 .xll 文件成为您的类的 COM 服务器。然后,您可以使用 CreateObject("MyNameSpace.MyClass") 从 VBA 后期绑定它们。

      您需要另一个步骤来设置类型库(在 VBA 中为您提供智能感知)。为此,您使用 tlbexp.exe 生成类型库。 regsvr32 / ComServer.RegisterServer 调用将找到类型库并注册它。

      您还可以将 .dll 打包到您的 .xll 文件中(将 pack='true' 属性添加到 ExternalLibrary 标记)并且类型库也将被打包(如果存在),并从 .xll 文件中的资源中注册当你调用 Regsvr32.exe 时

      因此最终结果可能是单个文件 .xll 加载项,它既是带有 UDF、功能区、RTD 服务器的 Excel 加载项,也是您可以从 VBA 访问的 COM 服务器。

      在此处讨论的更多信息:http://exceldna.codeplex.com/discussions/252721 和此处:http://groups.google.com/group/exceldna/browse_frm/thread/4c5a71efbe96d885

      【讨论】:

      • 太棒了!我认为有比我尝试的更好的方法来做到这一点。 @Govert,这是您编写的一款很棒的软件。继续努力!
      • 能否将相同的函数用作 Excel 中的 UDF 和通过 COM 从 VBA 中使用,还是我需要在 .NET 中编写包装函数?
      • 导出为 UDF 的函数必须是“静态的”,而 COM 可见的方法必须是实例方法。因此,要拥有与工作表函数相同的功能并且可以从 COM 对象调用,您需要进行一些包装。您可能还需要处理一些参数和返回值重新映射 - 错误值、缺少的参数和范围在 Excel UDF 调用和 VBA/COM 调用中的编组方式不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2021-03-17
      相关资源
      最近更新 更多