Ссылка программно в VBA множественные COM-библиотеки внутри Excel-DNA XLL - PullRequest
0 голосов
/ 13 июня 2019

Поэтому я использую Excel-DNA для упаковки двух COM-библиотек в один XLL.

<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

Однако, когда я добавляю ссылки в VBA, используя ThisWorkbook.VBProject.References.AddFromFile, только на одну Dll ссылается галочка. После этого другая dll появляется в Tools -> References, но ее флажок не установлен!

Я видел здесь , что tlb могут быть упакованы в XLL, а взамен на них можно ссылаться в VBA для получения полной поддержки раннего связывания.

Было бы очень здорово упаковать несколько Dll в один XLL, а также зарегистрировать их программно для раннего связывания с intellisense и всем остальным. Что я тут не так делаю?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

В файл .xll может быть встроен только один файл .tlb.

Итак, вам нужно сгенерировать один файл .tlb из нескольких сборок .NET. Это потребует некоторых усилий - я не знаю инструмента, который сделает это легко. См. Этот вопрос StackOverflow: Объединение двух файлов .IDL или двух файлов .tlb в один файл

  • Может быть, попытаться сгенерировать файлы .idl и объединить их как текст, прежде чем создавать файл .tlb?
  • Или используйте что-то вроде ILMerge для объединения сборок, затем запустите TlbExp для объединенной сборки.
  • Или найдите источник для TlbExp и заставьте его работать с несколькими сборками.

Дайте нам знать, если вы попробуете что-то из этого!

0 голосов
/ 24 июня 2019

Итак, основываясь на ответе @Govert, я попробовал следующее и смог заставить его работать ...

  • Из каждого TLB извлеките определение IDL с помощью OleWoo или OleViewer.OleViewer должен быть запущен с правами администратора, он не содержит синтаксических ошибок, таких как OleWoo, и включает необходимый импорт.
  • Создайте новый основной файл IDL и вставьте все определения в библиотечный блок каждого IDL внутри библиотечного блока.основного IDL.
  • Не стесняйтесь называть пространство имен библиотеки внутри основного IDL как угодно, поскольку пространство имен здесь каким-то образом не имеет значения, и вы все равно можете создавать те типы COM, определенные внутри этого IDL, если типы правильнозарегистрирован с правильным расположением DLL.
  • Используйте инструмент midl, чтобы скрыть файл IDL в TLB:
midl {Master IDL}.idl /tlb {Master IDL}.tlb
...