#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. Другой ответ ответил на то, о чем я спрашивал. Этот ответ — это то, что я в итоге сделал 🙂 Без обид.