У меня проблема с Excel Interop. По сути, я пытаюсь вызвать макрос в книге Excel из .NET со сложным типом аргумента. Однако при этом я сталкиваюсь с некоторыми различиями между Application и ApplicationClass, которые вызывают у меня некоторые головные боли.
Вот код:
Dim complexType As New BigBadClass
Dim result As Boolean = importerClass.ExcelApplication.ComObject.GetType().InvokeMember("Run", _
Reflection.BindingFlags.Default + Reflection.BindingFlags.InvokeMethod, Nothing, _
importerClass.ExcelApplication.ComObject, _
New Object() {"TheMacroName", AStringValue, ALongValue, complexType})
В макросе Excel VBA complexType сопоставляется с объектом.
(Интересное примечание: сначала я пробовал это в C # и продолжал получать исключения несоответствия типов, единственное различие между этим и кодом C # состоит в том, что он передается в complexType, созданном в VB.NET, а версия C # передается в complexType создан в C #. По какой-то причине, которую я до сих пор не выяснил (какие-то тонкие различия в типе Object?), C # один терпит неудачу, тогда как VB.NET один работает)
В любом случае, с приведенным фрагментом кода. Это работает, только если ExcelApplication.ComObject является ApplicationClass, а не интерфейсом приложения. Приложение не имеет члена GetType (). А так как они являются классами COM, вы не можете их разыграть. Я бы предпочел использовать приложение, если это возможно, так как у меня есть другая часть, которая будет автоматически загружать открытые книги для пользователя с помощью GetObject (..), и это ломается при использовании ApplicationClass (как еще раз вы не можете приводить классы COM, поэтому вы можете только приводить GetObject (..) в интерфейс приложения).
Кто-нибудь сталкивался с этой проблемой раньше?
Есть ли способ использовать что-то вроде GetObject (..) с ApplicationClass?
Или способ использовать GetType () с приложением?
Или, возможно, какой-нибудь способ приведения объектов COM? то есть: приведение приложения к ApplicationClass
Надеюсь, мои объяснения достаточно ясны, а код иллюстрирует то, что я делаю.