2012-01-27 8 views
0

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

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

Если я подписываю сборку с сильным именем, а затем, когда я пытаюсь построить DLL-файл, я получаю следующее сообщение об ошибке:

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

Каковы мои варианты?

ответ

2

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

Чтобы сделать это ваш класс должен быть ComVisible (или вся сборка должна быть ComVisible), и вы должны пометить ExternalLibrary как COMSERVER = «истинный» в файле .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 с UDF, лентами, RTD-серверами, а также COM-сервером, к которому вы можете получить доступ из VBA.

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

+0

Удивительный! Я подумал, что есть лучший способ сделать это, чем то, что я пытался. И @Govert, это отличное программное обеспечение, которое вы написали. Продолжайте в том же духе! – mwolfe02

+0

Можно ли использовать ту же функцию как UDF в Excel и VBA через COM, или мне нужно написать функции оболочки в .NET? – mwolfe02

+0

Функции, экспортируемые как UDF, должны быть «статическими», тогда как методы, видимые в COM, должны быть методами экземпляра.Таким образом, чтобы иметь те же функции, что и функции рабочего листа и вызываемые из COM-объекта, вам понадобится некоторая упаковка. Возможно, вам придется иметь дело с некоторыми параметрами и переназначением возвращаемого значения, слишком - значения ошибок, отсутствующие аргументы и диапазоны становятся раздельно распределенными в вызовах UDF Excel и вызовах VBA/COM. – Govert

4

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^