Как использовать XLL, разработанный ExcelDNA, из C# без Excel

мы создали XLL на C# с помощью ExcelDna, как описано в https://excel-dna.net/ -- - все работает при тестировании из Excel.

Мы хотели бы иметь возможность использовать этот XLL в других проектах .NET — другими словами, как нам «разместить» этот XLL из .NET? XLL не является допустимой сборкой .NET, поэтому я не могу добавить его в качестве ссылки .NET на другие проекты.

Это как-то делается через ExcelDna.Integration dll (которая ЯВЛЯЕТСЯ сборкой .net)?

Спасибо


person alernerdev    schedule 04.10.2018    source источник
comment
Какова ваша цель? Что находится внутри XLL, что вы хотите использовать из приложения C#?   -  person C. Augusto Proiete    schedule 05.10.2018
comment
Допустим, это набор классов С#, которые выполняют финансовые расчеты. Я хотел бы иметь возможность использовать их из разных внутренних программ .NET.   -  person alernerdev    schedule 05.10.2018
comment
Смотрите мой ответ ниже   -  person C. Augusto Proiete    schedule 05.10.2018


Ответы (1)


Excel-DNA — это просто связующее звено между сборками Excel и .NET.

Если вы хотите повторно использовать функциональность, которая находится внутри сборки .NET, которая загружается надстройкой Excel-DNA (т. е. XLL), вам не нужен XLL ни для чего... сборка, которую загружает XLL. Добавьте ссылку на эту в свое приложение .NET, и все готово... Точно так же, как и с любой другой библиотекой классов.

Другими словами, внутри вашего файла .dna, который используется Excel-DNA для определения того, что загружать, у вас есть что-то вроде этого:

<DnaLibrary Name="Your Add-In" RuntimeVersion="v4.0">
  <ExternalLibrary Path="YourAssembly.dll" ExplicitExports="false" ... />
</DnaLibrary>

YourAssembly.dll уже представляет собой сборку .NET, содержащую функции, предоставляемые Excel-DNA.


Что еще более важно, если вы знаете, что у вас будут разные «клиенты» .NET для ваших функций, то вы должны спроектировать для этого, изолировать повторно используемые функции в выделенной сборке и иметь ссылку на сборку Excel-DNA, и выставить функции в Excel, вместо того, чтобы заставлять клиентов зависеть от сборок Excel-DNA.

e.g.

  • Библиотека классов С# Functions.dll (ни на что не ссылается)
  • Библиотека классов C# ExcelAddIn.dll (ссылки Functions.dll)
  • Приложение C# MyCsApp.exe (ссылки Functions.dll)
  • Библиотека классов C# FunctionsComInterop.dll (ссылки Functions.dll)
  • Приложение C++ MyCppApp.exe (вызовы FunctionsComInterop.dll)
  • и т.п.

диаграмма

В приведенном выше примере:

  • Functions.dll не ссылается на какую-либо сборку Excel-DNA и не ничего не предоставляет через COM. Он должен иметь как можно меньше зависимостей (в идеале ни одного!)

  • ExcelAddIn.dll создает мост к Excel-DNA и предоставляет функции Excel, которые могут вызываться Excel через Excel-DNA. Эти функции просто пересылают вызовы сборке Functions.dll... Ничего более.

  • FunctionsComInterop.dll создает мост к C++ и предоставляет функции COM, которые могут вызываться приложением C++. Эти функции просто перенаправляют вызовы на сборку Functions.dll... Ничего более.

person C. Augusto Proiete    schedule 04.10.2018
comment
Спасибо. Что делать, если вызывающим языком является C++, а я хочу использовать COM? Как мы вставляем эту (или эти) DLL/XLL в клиент C++? Благодарность - person alernerdev; 05.10.2018
comment
В этом случае вам нужно будет предоставить функции С# через COM Interop и заставить С++ вызывать вашу сборку. Я бы рекомендовал создать отдельную библиотеку классов, которая делает именно это — предоставляет функции через COM и перенаправляет вызов основной сборке C#. Вы фактически создаете API для клиента C++, поэтому вы должны четко указать это и иметь контроль над интерфейсом. - person C. Augusto Proiete; 05.10.2018