没有强名称签名的COM访问VB.Net DLL

时间:2012-01-27 22:19:21

标签: vb.net com strongname excel-dna

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

如果我将程序集保留为未签名,我可以访问所有ExcelDNA功能但无法访问COM。

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

  

无法发出汇编:引用的汇编'ExcelDna.Integration'没有强名称

我有什么选择?

2 个答案:

答案 0 :(得分:4)

您不必强名[ComVisible]程序集。只有在要将其安装在GAC中时才需要它。虽然对抗DLL地狱并不是一个坏主意,但并非绝对必要。您需要使用/ codebase选项将其注册到Regasm.exe。 Visual Studio已经自动执行此操作,但Express版本中可能缺少该选项。

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

答案 1 :(得分: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文件中(向ExternalLibrary标记添加pack ='true'属性),如果存在,则类型库也将打包,并从.xll文件中的资源注册当你调用Regsvr32.exe

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

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