我有Win7 64位,Visual Studio 2010,我为Vs2010开发了一个Addin。
我尝试在错误列表Windows VS中显示消息。
我在 OnBuildProjConfigDone 构建事件中使用 ErrorListProvider for Addin
this._buildEvents.OnBuildProjConfigDone += new _dispBuildEvents_OnBuildProjConfigDoneEventHandler(_buildEvents_OnBuildProjConfigDone);
我收到此错误无效操作异常
服务"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);
}
}
错误列表助手
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。
有什么建议吗?
Ryan Molden (MSFT) 说:
Package.GetGlobalService依赖于至少一个MPF软件包(来自 您引用的特定版本的强积金)已加载。 由于您自己是加载项而不是包,因此无法保证 以任何方式。
你应该传递类似新的东西 ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider))) 作为 ErrorListProvision 的参数
Package.GetGlobalService 返回 null。
我在我的插件中使用此代码。我测试它,我没有收到错误,我可以在错误列表 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");
}
}