Вызов незарегистрированной .NET dll из Excel VBA

#c# #.net #excel

#c# #.net #excel

Вопрос:

Мне нужно написать .NET dll, которую можно вызывать непосредственно из модуля VBA Excel, чтобы dll и .xls просто развертывались в одном каталоге без какой-либо регистрации COM.

Назначение dll — запускать алгоритмы, реализованные на C.

Как мне следует поступить? Возможно ли это вообще?

Комментарии:

1. разработайте точную ситуацию… какова будет цель dll?

Ответ №1:

Вы не объясняете, какой будет роль .NET в вашем сценарии. Вы действительно можете вызвать многие библиотеки C непосредственно из VBA, используя ‘Declare Function’.

Если вы считаете .NET полезным и хотите вызывать функции вашей библиотеки .NET как пользовательские функции (UDF) из Excel, вы можете использовать Excel-DNA. Это предоставляет вам библиотеку надстроек .xll, которая интегрирует вашу библиотеку .NET в Excel. Вам все равно придется каким-то образом открыть надстройку .xll — либо с помощью File -> Open, добавив ее как надстройку Excel, либо автоматически из какого-либо VBA в вашей книге. Но для этого не требуется никакой другой регистрации.

Из .Сетевая библиотека вы можете вызывать функции C .dll с помощью P / Invoke, добавлять категории, описания функций и аргументов для интеграции в мастер функций и т.д.

(Отказ от ответственности: Я разработчик Excel-DNA.)

Ответ №2:

Вы видели эту статью MSDN? По сути, вы регистрируете функции из библиотеки DLL, а не саму библиотеку DLL. Я не знаю, очень ли ясно это изложено в статье, но синтаксис:

 [Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]
  

где «libname» может содержать полный путь, например «C:tmpalgo.dll «или только имя, например «algo.dll «. Во втором случае в локальном пути будет выполнен поиск соответствующего двоичного файла.

Ответ №3:

Если DLL содержит функции C, тогда вам следует избегать .net и CLR. Это ненужные накладные расходы.

Вместо этого используйте компилятор C, например MSVC, для сборки DLL и экспорта необходимых функций из этой DLL. Затем импортируйте функции DLL в VBA с Declare инструкциями.

При встраивании функций C в DLL убедитесь, что вы используете __stdcall соглашение о вызовах, поскольку это единственный вариант с Declare . Вам также может потребоваться использовать файл .def при сборке DLL, чтобы избежать оформления имени.

Очень простой пример:

C

 int __stdcall add(int a, int b)
{
    return a b;
}
  

VBA

 Public Declare Function add Lib "mylib.dll" (ByVal a As Long, ByVal b As Long) As Long
  

Комментарии:

1. Это также стало моим заключением, поэтому я пропустил . Сетевая оболочка.

2. Другой ответ ответил на то, о чем я спрашивал. Этот ответ — это то, что я в итоге сделал 🙂 Без обид.