2012-01-27 56 views
0

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

如果我离开程序集无符号,我可以访问所有的ExcelDNA功能,但没有COM访问。

如果我用强名称程序集签名,然后当我尝试建立.dll文件我得到以下错误:

Unable to emit assembly: Referenced assembly 'ExcelDna.Integration' does not have a strong name

我有哪些选择?

回答

2

Excel-DNA有一个选项可以将.NET类直接公开给COM,所以你可以直接使用它们作为常规的COM类从VBA。

要做到这一点您的类必须是标记有ComVisible特性(或整个装配必须标记有ComVisible特性),并且必须在文件。DNA标记ExternalLibrary为ComServer =“真”,是这样的:

<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加载项,这是一个Excel加载项与UDFs,功能区,RTD服务器,也可以访问的COM服务器VBA。

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

+0

太棒了!我觉得有一个更好的方法来做到这一点,而不是我想要的。而@Govert,这是你写的一个伟大的软件。保持伟大的工作! – mwolfe02 2012-01-29 02:55:51

+0

可以使用相同的函数作为Excel中的UDF和通过COM的VBA,还是我需要在.NET中编写包装函数? – mwolfe02 2012-01-30 15:46:01

+0

作为UDF导出的函数必须是'static',而COM可见方法必须是实例方法。因此,为了使用与工作表函数相同的功能并从COM对象中调用,您需要一些包装。您可能需要处理一些参数和返回值重新映射 - 在Excel UDF调用和VBA/COM调用中,错误值,缺少参数和范围的编组方式会有所不同。 – Govert 2012-01-30 16:20:40

4

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

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