我正在使用Visual Studio 2008 Express将VB6 dll转换为VB.Net。我想使用相同的.dll通过Excel-DNA与Excel集成,但也可以通过COM获得(我需要能够从VBScript和VBA调用它)。
如果我将程序集保留为未签名,我可以访问所有ExcelDNA功能但无法访问COM。
如果我使用强名称对程序集进行签名,那么当我尝试构建.dll时,会出现以下错误:
无法发出汇编:引用的汇编'ExcelDna.Integration'没有强名称
我有什么选择?
答案 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。