1

我有Win7 64位,Visual Studio 2010,並且我開發了一個Addin for Vs2010。顯示錯誤列表Visual Studio 2010中的Windows Addin

我嘗試在錯誤列表窗口VS.中顯示消息。
我用ErrorListProvider在OnBuildProjConfigDone建立事件外接

this._buildEvents.OnBuildProjConfigDone += new _dispBuildEvents_OnBuildProjConfigDoneEventHandler(_buildEvents_OnBuildProjConfigDone); 

我得到這個錯誤出現InvalidOperationException

服務「Microsoft.VisualStudio.Shell.Interop.IVsTaskList」必須安裝此功能 工作。確保此服務是可用的 。

連接

public partial class Connect : IDTExtensibility2, IDTCommandTarget, System.Windows.Forms.IWin32Window, IOleCommandTarget 

OnBuildProjConfigDone

void _buildEvents_OnBuildProjConfigDone(string project, string projectConfig, string platform, string solutionConfig, bool success) 
{ 

// Omitted 
if (!resul) 
{ 
       project.DTE.ExecuteCommand("Build.Cancel"); 

       var errorListHelper = new ErrorListHelper(); 
       ErrorListProvider errorProvider = errorListHelper.GetErrorListProvider(); 
       var newError = new ErrorTask(); 
       newError.ErrorCategory = TaskErrorCategory.Message; 
       newError.Category = TaskCategory.BuildCompile; 
       newError.Text = "Cualquier mensaje de error aqui"; 
       errorProvider.Tasks.Add(newError); 
} 
}  

ErrorListHelper

public class ErrorListHelper : System.IServiceProvider 
{ 
    public ErrorListProvider GetErrorListProvider() 
    { 
     ErrorListProvider provider = new ErrorListProvider(this); 
     provider.ProviderName = "Provider"; 
     provider.ProviderGuid = System.Guid.NewGuid(); 
     return provider; 
    } 

    public object GetService(Type serviceType) 
    { 
     return Package.GetGlobalService(serviceType); 
    } 
} 

@JohnL的建議:我在我的GetService方法中放置了一個斷點,Package.GetGlobalService返回null

有什麼建議嗎?

+0

這很奇怪,我只是想發佈一個關於這個確切問題的問題(或者至少我認爲這是同樣的問題)。在我的例子中,'errorProvider.Tasks.Add'拋出了'InvalidOperationException',並帶有該錯誤消息。你可以在你的'GetService'方法中放置一個斷點,看看'Package.GetGlobalService'是否返回null? TA! – JohnL

+0

只是我已經確認相同的代碼可以在VS2008和2010 VSPackage中使用。 (稍做修改是因爲Package已經有一個GetService方法)。 VS2010可能需要稍微不同的GetService實現。 – JohnL

回答

0

瑞安莫爾登(MSFT)說:

Package.GetGlobalService是依靠至少一個MPF包(從 你引用MPF的具體版本)已被加載。 既然你自己是一個AddIn不是一個包,你不能保證 以任何方式。

你應該通過像新 的ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)))作爲參數傳遞給ErrorListProvide

Package.GetGlobalService被返回null。

我在我的Addin中使用這段代碼。我測試它,我得到的不是錯誤,並且我可以在ErrorList Windows VS中顯示錯誤和警告。我會安全地測試更多。

public partial class Connect 
    { 
     ErrorListProvider _errorListProvider = null; 

     void CreateErrorListProvider() 
     { 
      if (_errorListProvider == null) 
      { 
       System.IServiceProvider serviceProvider = new ServiceProvider(_applicationObject as Microsoft.VisualStudio.OLE.Interop.IServiceProvider); 
       _errorListProvider = new ErrorListProvider(serviceProvider); 
       _errorListProvider.ProviderName = "custom Errors"; 
       _errorListProvider.ProviderGuid = new Guid("xxxxxxxxxxxxxx"); 

      } 
     }