COM-доступ к VB.Net dll без строгой подписи - PullRequest
0 голосов
/ 28 января 2012

Я конвертирую VB6 dll в VB.Net, используя Visual Studio 2008 Express. Я хочу использовать тот же .dll для интеграции с Excel через Excel-DNA, но также быть доступным через COM (мне нужно иметь возможность вызывать его из VBScript и VBA).

Если я оставлю сборку без знака, у меня будет доступ ко всем функциям ExcelDNA, но нет доступа к COM.

Если я подписываю сборку строгим именем, то при попытке собрать .dll я получаю следующую ошибку:

Невозможно создать сборку. Ссылочная сборка 'ExcelDna.Integration' не имеет строгого имени

Какие у меня варианты?

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Вам не нужно строго называть [ComVisible] сборку. Это требуется только тогда, когда вы хотите установить его в GAC. Не обязательно, хотя и неплохая идея бороться с DLL Hell. Вам необходимо зарегистрировать его в Regasm.exe, используя параметр / codebase. Visual Studio уже делает это автоматически, хотя эта опция может отсутствовать в Express Edition.

Исправить вторую проблему тоже не составит труда. Просто перестройте решение Excel-DNA из исходного кода, который вы можете загрузить с Codeplex .

2 голосов
/ 28 января 2012

Excel-DNA имеет возможность выставлять ваши классы .NET непосредственно COM, поэтому вы можете использовать их непосредственно из VBA как обычные COM-классы.

Для этого ваш класс должен быть ComVisible (или вся сборка должна быть ComVisible), и вы должны пометить ExternalLibrary как ComServer = 'true' в файле .dna, что-то вроде:

<DnaLibrary RuntimeVersion='v4.0' />
  <ExternalLibrary Path='MyAddIn.dll' ComServer='true' />
</DnaLibrary>

Тогда у вас есть несколько вариантов регистрации: либо вызвать «Regsvr32.exe MyAddInDna.xll» или в AutoOpen вашей надстройки вызовите ExcelDna.Integration.ComServer.RegisterServer ()

Оба этих параметра устанавливают записи реестра таким образом, что файл .xll становится COM-сервером для ваших классов. Затем вы можете обращаться к ним с поздним связыванием из VBA с помощью CreateObject («MyNameSpace.MyClass»).

Вам нужен еще один шаг для настройки библиотеки типов (чтобы дать вам intellisense в VBA). Для этого вы генерируете библиотеку типов с помощью tlbexp.exe. Вызов regsvr32 / ComServer.RegisterServer найдет библиотеку типов и зарегистрирует ее.

Вы также можете упаковать .dll в ваш файл .xll (добавив атрибут pack = 'true' к тегу ExternalLibrary), и библиотека типов также будет упакована, если она есть, и зарегистрирована на ресурсе в файле .xll. когда вы звоните Regsvr32.exe

Таким образом, конечным результатом может быть надстройка для одного файла .xll, которая является одновременно надстройкой Excel с пользовательскими функциями, лентами, RTD-серверами, а также COM-сервером, к которому можно получить доступ из VBA.

Больше информации в обсуждениях здесь: http://exceldna.codeplex.com/discussions/252721 и здесь: http://groups.google.com/group/exceldna/browse_frm/thread/4c5a71efbe96d885.

...