Mam dllkę napisaną w C# w technologii VSTO. Jest ona załadowana w Wordzie jako COM Add-in. W dllce zaimplementowany jest interfejs IAddInUtilities, dzięki czemu możemy korzystać z jej funkcji po stronie VBA w taki sposób:

Kopiuj
Private Function COMAddInMyTools() As COMAddIn
On Error GoTo ErrorHandler
    
    Static ain As COMAddIn
    If IsNothing(ain) Then
        Set ain = Application.COMAddIns("MyTools")
        If IsNothing(ain) Then
			ToLog "COMAddInMyTools: Brak MyTools"
        End If
        If Not ain.Connect Then
            ain.Connect = True
        End If
    End If
    Set COMAddInMyTools = ain

Exit Function
ErrorHandler:
    Dim e As TError
    e = ErrorObject(Err)
	ToLog "[starter] COMAddInMyTools: " & ErrorObjectMessage(e)
    Err.Clear
End Function

Function MyTools() As Object
    Set MyTools = COMAddInMyTools.Object
End Function

Sub TestMyTools()
    Debug.Print MyTools.HelloWorld
End Sub

Gdzie HelloWorld jest funkcją w klasie implementującej interfejs IAddInUtilities i zwraca string.

Problem pojawia się wtedy, gdy chcę przekazać jakikolwiek obiekt, zamiast typu prostego. Dajmy na to XmlDocument. Po stronie VBA możemy pracować z xmlami w typie DOMDocument60 z biblioteki MSXML. Gdy próbuję po stronie C# zwrócić XmlDocument, a po stronie VBA władować go w DOMDocument60, to niestety dostaję błąd: Type mismatch.

Kopiuj
Sub TestXmlMyTools()
    Dim xml As DOMDocument60
    Set xml = MyTools.GetXml
End Sub

W watches widzę, że obiekt zwracany przez dllkę jest typu Variant/Object. Czy da się jakoś ten obiekt rzutować na DOMDocument, czy jedyne co mi pozostaje, to zwracać stringa i ładować go przez xml.LoadXml?