Использование проекта VBA как dll в проекте wpf
У меня есть проект vba, я хочу сделать то же самое в C# wpf, так есть ли способ, которым я могу использовать тот же проект и просто сделать пользовательский интерфейс, используя wpf? Есть ли способ создания dll этого проекта vba и добавления его в новый проект wpf и вызова API существующего проекта.
1 ответ
Не совсем. VBA является урезанной версией VB6, поэтому у вас нет возможности публикации библиотеки полного типа. Тем не менее, возможно (хотя и довольно болезненно), чтобы VBA реализовал опубликованные typelib COM-интерфейсы, а затем открыл их для управляемого кода и вызывал их через COM-взаимодействие из любого кода C#, который вам нравится (включая WPF).
В основном вам необходимо:
- Определите IDispatch или двойной интерфейс
- Опубликуйте его в библиотеке типов
- Ссылка typelib на ваш проект VBA (и ваш проект на C#, если он там не возник)
- Напишите модуль класса VBA, который реализует новый интерфейс
- Установите свойство экземпляра класса в PublicNotCreatable
- Напишите функцию shim в модуле VBA (не класс), который вы можете вызывать из C# через метод Application.Run в Excel - эта функция должна создать экземпляр класса VBA и вернуть его. Вызывающий код C# преобразует возвращаемое значение в управляемую версию IDispatch или двойного интерфейса, который вы объявили ранее.
Вуаля - теперь вы можете позвонить свой код VBA непосредственно из C#. Это было много лет назад, но я сделал это с гигантской унаследованной кодовой базой VBA с большим успехом. Это был очень болезненный процесс, который чреват опасностями. Происходит утечка интерфейсов, существует ряд проблем, связанных с версией COM-интерфейса и версией библиотеки типов, и проблем с многопоточностью предостаточно.
Все это говорит о том, что если вы не знаете, как выполнять большинство этих задач, или не можете быстро найти необходимые ресурсы, вам, вероятно, следует подумать о переносе VBA на C#.
Удачи!