在VBA中以编程方式引用Excel-DNA XLL中的多个COM dll

时间:2019-06-13 13:41:32

标签: excel-dna

所以我正在使用Excel-DNA在一个XLL中打包两个COM dll。

<ExternalLibrary Path="FancyDna.DllOne.dll" ExplicitExports="false" LoadFromBytes="true" ComServer="true" Pack="true" />
<ExternalLibrary Path="FancyDna.DllTwo.dll" ExplicitExports="false" LoadFromBytes="true" ComServer="true" Pack="true" />

在VBA中:

Sub TestEarlyBound()
    Application.RegisterXLL Application.ActiveWorkbook.Path & "\build\FancyDna.Pack-AddIn64-packed.xll"
    ThisWorkbook.VBProject.References.AddFromFile Application.ActiveWorkbook.Path & "\build\FancyDna.Pack-AddIn64-packed.xll"
    Call CallDllOne
    Call CallDllTwo
End Sub

但是,当我使用ThisWorkbook.VBProject.References.AddFromFile在VBA中添加引用时,仅勾选了一个Dll并勾选了复选框。完成后,另一个dll将显示在工具->引用中,但未选中其复选框!

here看到可以将tlb打包在XLL中,作为回报,可以在VBA中引用它以获得完整的早期绑定支持。

将多个Dll打包到一个XLL中并以编程方式注册它们以与intelisense和所有内容进行早期绑定真的很酷。我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

.xll中只能嵌入一个.tlb文件。

因此,您需要做的是从多个.NET程序集中生成一个.tlb文件。 这将需要一些努力–我不知道可以轻松实现此目的的工具。请参阅以下StackOverflow问题:Merging two .IDL files or two .tlb files into one file

  • 也许在生成.tlb之前尝试生成.idl文件并将其合并为文本?
  • 或者使用类似ILMerge的方法组合程序集,然后在组合的程序集上运行TlbExp。
  • 否则,请找到TlbExp的源并使之与多个程序集一起使用。

让我们知道您是否尝试其中任何一种!

答案 1 :(得分:0)

因此,根据@Govert的回答,我尝试了以下方法,可以使其工作...

  • 从每个TLB中,使用OleWoo或OleViewer提取IDL定义。 OleViewer必须以管理员权限启动,不包含OleWoo之类的语法错误,并包含必要的导入。
  • 创建一个新的主IDL文件,并将所有定义粘贴到每个IDL的库块内。将其粘贴到主IDL的库块内。
  • 可以随意将主IDL内的库命名空间命名为这里的命名空间,这无关紧要,并且如果在正确的DLL位置正确注册了这些IDL,您仍然可以创建那些在IDL内部定义的COM类型。 / li>
  • 使用midl工具将IDL文件转换为TLB:
midl {Master IDL}.idl /tlb {Master IDL}.tlb