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

Reference programmatically in VBA multiple COM dlls inside an Excel-DNA XLL

所以我使用 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 出现在工具 --> 参考之后,但它的复选框没有被选中!

我看到 heretlb 可以打包在 XLL 中,在 return 中可以在 VBA 中引用以获得完整的早期绑定支持。

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

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

所以您需要做的是从多个 .NET 程序集生成一个 .tlb 文件。 这需要一些努力——我不知道有什么工具可以轻松做到这一点。请参阅这个 Whosebug 问题:Merging two .IDL files or two .tlb files into one file

  • 也许尝试生成 .idl 文件并在生成 .tlb 之前将它们合并为文本?
  • 或者使用 ILMerge 之类的东西来合并程序集,然后 运行 TlbExp 合并程序集。
  • 或者找到 TlbExp 的源代码并使其适用于多个程序集。

如果您尝试其中任何一个,请告诉我们!

因此,根据@Govert 的回答,我尝试了以下方法并使其有效...

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