COM访问VB.Net dll而不进行强名称签名



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

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

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

无法发出程序集:引用的程序集"ExcelDna.Itegration"没有强名称

我有什么选择?

您不必对[ComVisible]程序集进行强命名。只有当您想在GAC中安装它时,才需要它。不是严格必要的,虽然不是一个坏主意来对抗DLL地狱。您需要使用/codebase选项将其注册到Regasm.exe。Visual Studio已经自动做到了这一点,尽管学习版中可能缺少该选项。

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

ExcelDNA有一个选项,可以将.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"或者在外接程序的"自动打开"中,调用ExcelDna.Itegration.ComServer.RegisterServer()

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

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

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

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

在这里讨论更多信息:http://exceldna.codeplex.com/discussions/252721在这里:http://groups.google.com/group/exceldna/browse_frm/thread/4c5a71efbe96d885.

最新更新