私は 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 であることを認識させるにはどうすればよいですか、または実際に DocumentService であるものを取得するにはどうすればよいですか?
編集:無効なキャストを回避するために「As DocumentService」も削除しようとしましたが、ウォッチとして検査すると、オブジェクトについて他に何も発見できません。また、問題に光を当てることを期待して、次のことも試しました(ここで推奨):
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」とあり、単に私の憤りを再確認するだけでした。私は本当にそれをどうするか分かりません。
この関連記事は、同じ問題を抱えている人に最も近いものですが、回答がありませんでした: How to open WorkItem (VS-Team Explorer) from outside Visual Studio? .
ありがとうございました!