在Word Interop中调用函数时

时间:2018-09-07 17:15:42

标签: vb.net visual-studio dll office-interop class-library

我的应用程序中的类库遇到一些奇怪的麻烦。我们有几十个ComVisible类,最近我发现一种情况,即通过COM公开的某个类的名称不再像以前那样出现了。

我能够在一个小的示例程序中重复该问题,并且该问题与Microsoft Word Interop中涉及的一行有关。具体来说,我有一个Window类。通常,此类是可作为“窗口”显示的类,但是如果我在Word Interop中引用了Document.ActiveWindow属性,那么我的类将变为可作为“ TestLibrary_Window”显示的类。在我的真实应用程序中,我有100多个地方引用Window,并且我不想将它们全部更改为TestLibrary_Window,而且我还想了解通过引用一个属性来改变我的库公开方式可能会发生的情况本身。

我可以使用程序OleWoo(http://www.benf.org/other/olewoo/)查看TLB文件来轻松演示结果。请注意,在结果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 :(得分:0)

就像@TnTinMn在上面的评论中提到的那样,我遇到的问题确实与对Microsoft.Office.Interop.Word的引用中的“嵌入互操作类型”有关。通过将此选项设置为false,现在可以按预期创建我的TLB。