Имя класса в библиотеке, которое искажается при вызове функций в Word Interop - PullRequest
0 голосов
/ 07 сентября 2018

У меня странные проблемы с библиотекой классов в моем приложении. У нас есть десятки классов ComVisible, и недавно я обнаружил ситуацию, когда имя определенного класса, доступного через COM, больше не встречается, как раньше.

Мне удалось продублировать проблему в небольшом примере программы, и проблема связана с одной строкой, связанной с Microsoft Word Interop. Конкретно у меня есть класс Window. Обычно этот класс является ComVisible как «Window», но если я ссылаюсь на свойство Document.ActiveWindow в Word Interop, мой класс становится ComVisible как «TestLibrary_Window». В моем реальном приложении у меня есть сотни мест, где я ссылаюсь на Window, и я не хочу менять их все на TestLibrary_Window, и более того, я хочу понять, что может происходить, ссылаясь на одно свойство, изменяющее способ отображения моей библиотеки сам по себе.

Я легко могу продемонстрировать результат, посмотрев на файл TLB с помощью программы OleWoo (http://www.benf.org/other/olewoo/).. Обратите внимание, что в Результате 1 вы видите запись для окна Coclass, но в Результате 2 вы видите запись для Coclass TestLibrary_Window. Результат 1 - это то, как я ожидаю, что TLB встретится, и если строка с ошибкой в ​​моем коде закомментирована, это то, что я получаю. Результат 2 - это то, что я получаю, когда я раскомментирую строку с ошибкой.

Ниже приведена минимальная реализация, дублирующая мою проблему. Если закомментированная строка в TestClass оставлена ​​закомментированной, то у меня нет проблем, однако, если я раскомментирую эту строку, у меня возникнет проблема. Обратите внимание, что в моем примере кода мне не нужен код в классе Window для демонстрации проблемы.

Файл 1: TestClass.vb

Imports System.Runtime.InteropServices

<ComVisible(True)>
Public Class TestClass
    Public Sub testFunction()
        Dim oWord As Microsoft.Office.Interop.Word.Application = CreateObject("Word.Application")
        Dim oDoc As Microsoft.Office.Interop.Word.Document = oWord.Documents.Open("c:\temp\test.docx")

        'trouble line
        'oDoc.ActiveWindow.View.TableGridlines = True

        oDoc.Save()
    End Sub

End Class

Файл 2: Window.vb

Imports System.Runtime.InteropServices

<ComVisible(True)>
Public Class Window

End Class

Результат 1: правильный TLB

// Generated .IDL file (by OleWoo)
[
  uuid(b2effb21-a565-4092-bc8f-b92aa429952a),
  version(1.0),
  custom(90883f05-3d28-11d2-8f17-00a0c9a6186d, "TestLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=974b55dd4adecdf1")
]
library TestLibrary
{
    // Forward declare all types defined in this typelib
    dispinterface _TestClass
    interface _TestClass
    dispinterface _Window
    interface _Window
    [
      uuid(eb22957e-07c0-34b2-b813-48d0e9376d35)
    ]
    coclass TestClass {
        [default] interface _TestClass#i;
        interface _Object#i;
    };

    [
      uuid(2266afaa-2145-3508-bb4b-9f8579112b14)
    ]
    coclass Window {
        [default] interface _Window#i;
        interface _Object#i;
    };

    [
      uuid(a13ff8b0-ac7c-33e5-b0f3-5366304512ac),
      hidden,
      dual,
      oleautomation
    ]
    interface _TestClass : IDispatch#i {

    };

    [
      uuid(b81f8ed9-9e71-3248-b3a9-b7a104b3a597),
      hidden,
      dual,
      oleautomation
    ]
    interface _Window : IDispatch#i {

    };

};

Результат 2: неверный файл TLB

// Generated .IDL file (by OleWoo)
[
  uuid(b2effb21-a565-4092-bc8f-b92aa429952a),
  version(1.0),
  custom(90883f05-3d28-11d2-8f17-00a0c9a6186d, "TestLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=974b55dd4adecdf1")
]
library TestLibrary
{
    // Forward declare all types defined in this typelib
    dispinterface _TestClass
    interface _TestClass
    dispinterface _TestLibrary_Window
    interface _TestLibrary_Window
    [
      uuid(eb22957e-07c0-34b2-b813-48d0e9376d35)
    ]
    coclass TestClass {
        [default] interface _TestClass#i;
        interface _Object#i;
    };

    [
      uuid(2266afaa-2145-3508-bb4b-9f8579112b14)
    ]
    coclass TestLibrary_Window {
        [default] interface _TestLibrary_Window#i;
        interface _Object#i;
    };

    [
      uuid(a13ff8b0-ac7c-33e5-b0f3-5366304512ac),
      hidden,
      dual,
      oleautomation
    ]
    interface _TestClass : IDispatch#i {

    };

    [
      uuid(b81f8ed9-9e71-3248-b3a9-b7a104b3a597),
      hidden,
      dual,
      oleautomation
    ]
    interface _TestLibrary_Window : IDispatch#i {

    };

};

1 Ответ

0 голосов
/ 10 сентября 2018

Как упомянул @TnTinMn в комментарии выше, проблема, с которой я столкнулся, действительно была связана с «типами вставки взаимодействия» в ссылке на Microsoft.Office.Interop.Word. При переключении этой опции на false, мой TLB теперь создается, как и ожидалось.

...