C# 了解Component.GetService()
我在Usercontrol中有一个使用此代码的方法C# 了解Component.GetService(),c#,service,components,system.componentmodel,C#,Service,Components,System.componentmodel,我在Usercontrol中有一个使用此代码的方法 public bool GetActiveDocument(ref EnvDTE.Document doc) { try { var dte = (DTE2)GetService(typeof(SDTE)); doc = dte.ActiveDocument; if (doc == null)
public bool GetActiveDocument(ref EnvDTE.Document doc)
{
try
{
var dte = (DTE2)GetService(typeof(SDTE));
doc = dte.ActiveDocument;
if (doc == null)
{
MessageBox.Show("There isn't any file open in the Code Editor");
return false;
}
else return true;
}
catch (Exception)
{
MessageBox.Show("There was a problem getting the actual file, verify if it is open");
return false;
}
}
我想将此方法移动到一个“代理”类,该类将充当VisualStudio和我的应用程序之间的中介。问题在于,只有在控件内调用活动文档时,GetService才会正确返回该文档。当我将该方法移动到代理类时,GetService没有定义。我搜索该方法来自ComponentModel.Component,因此我使代理类派生自Component。一切都可以编译,但当我请求活动文档时,总会发生异常。我发现我不太理解GetService()方法的工作原理。请对此提供帮助。Component.GetService在分配给该组件的站点属性的ISite实例上调用IServiceProvider.GetService(假设存在)。您不需要让您的代理实例从组件继承,但需要授予它访问ISite/IServiceProvider的权限。谢谢您的帮助。我仍然不太明白,但我只需要通过ISite的引用调用GetService。我的疑问是,当我将光标放在原始GetService方法上时,Intellisense告诉我,我实际调用的是Component.GetService,而不是IServiceProvider.GetService?Component.GetService的实现调用Site属性的GetService方法。Intellisense显示文档,而不是实现。如果您对Component.GetService实现的细节感兴趣,您可能需要获取Reflector()的副本。然后我看了一下GetService的实现,正如您所说的,它的实现对象是调用GetService()方法的最终责任。多么令人印象深刻的工具,他们如何设法重建代码令人印象深刻。我仍然觉得我对组件模型没有真正的理解,但这确实有助于启蒙,:)。我将继续搜索这个主题。