У меня странные проблемы с библиотекой классов в моем приложении. У нас есть десятки классов 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 {
};
};