4

我正在为 Microsoft Outlook 2007 编写插件。我的目标是在 Visual Studio 2010 实例中打开一个工作项,我知道该实例存在并且为 TFS 2012 加载了包。以下代码工作正常,直到最后一行给出我是一个 InvalidCastException:

Imports Microsoft.VisualStudio.TeamFoundation.WorkItemTracking
Imports Microsoft.TeamFoundation.Client
Imports Microsoft.VisualStudio.OLE.Interop
Imports Microsoft.VisualStudio.Shell


Private Sub Test()

    Dim vsObj As IServiceProvider = System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0")
    Dim sp As New ServiceProvider(vsObj)
    Dim docService As DocumentService = sp.GetService(GetType(DocumentService))

    ... do stuff with docService ...

End Sub

这是完整的异常文本:

无法将类型为“System.__ComObject”的 COM 对象转换为类类型“Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.DocumentService”。表示 COM 组件的类型的实例不能转换为不表示 COM 组件的类型;但是,只要底层 COM 组件支持对接口的 IID 的 QueryInterface 调用,它们就可以转换为接口。

我向服务提供商询问了 DocumentService,它给了我一些东西,但那东西告诉我它实际上不是 DocumentService。这是怎么回事?我如何让 DocumentService 知道它是一个 DocumentService,或者我如何获得实际上是一个的东西?

编辑:我还尝试删除“As DocumentService”以通过无效的演员表,但是当我将其作为 Watch 进行检查时,没有发现任何关于该对象的其他内容。我还尝试了以下方法(在此处推荐),希望它能对问题有所了解:

    Dim vsObj As IServiceProvider = System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0")
    Dim sp As New ServiceProvider(vsObj)
    Dim docService = sp.GetService(GetType(DocumentService))

    'Note that I still didn't specify a type for docService above.
    MsgBox(Microsoft.VisualBasic.Information.TypeName(docService))

令我惊恐的是,消息框上写着“DocumentService”,只是重申了我的愤慨。我真的不知道该怎么办。

这篇相关文章是我能找到的最接近遇到同样问题的人的文章,但没有得到回答:如何从 Visual Studio 外部打开 WorkItem (VS-Team Explorer)?.

谢谢!

4

0 回答 0