0

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

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

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

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

我有哪些选择?

4

2 回答 2

4

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

解决第二个问题也不难。只需从 Codeplex 下载的源代码重建 Excel-DNA 解决方案。

于 2012-01-27T23:00:02.310 回答
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 。

于 2012-01-28T09:55:32.143 回答