Excel Interop: различия между Application и ApplicationClass - PullRequest
0 голосов
/ 07 октября 2009

У меня проблема с 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

Надеюсь, мои объяснения достаточно ясны, а код иллюстрирует то, что я делаю.

1 Ответ

1 голос
/ 07 октября 2009

Это должно вас заинтересовать:

Запуск макроса с использованием VB.Net

Как только я увидел отражение, я понял, что это не совсем правильно.

Просто для справки я разместил код, доступный на источнике:

    Dim oExcel As Excel.ApplicationClass
    Dim oBook As Excel.WorkbookClass
    Dim oBooks As Excel.Workbooks

    'Start Excel and open the workbook.'
    oExcel = CreateObject("Excel.Application")
    oExcel.Visible = True
    oBooks = oExcel.Workbooks
    oBook = oBooks.Open("c:\book1.xls")

    'Run the macros.'
    oExcel.Run ("DoKbTest")
    oExcel.Run("DoKbTestWithParameter", "Hello from VB .NET Client")

    'Clean-up: Close the workbook and quit Excel.'
    oBook.Close (False)
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook)
    oBook = Nothing
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks)
    oBooks = Nothing
    oExcel.Quit()
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel)
    oExcel = Nothing
...