gpt4 book ai didi

c# - 罗斯林 : Get Current Project/Get Current Doc that is selected

转载 作者:行者123 更新时间:2023-11-30 16:49:40 27 4
gpt4 key购买 nike

我正在为我的团队开发一个代码生成器 (VSIX),在我与 VSIX 可扩展性框架作斗争之后,我打算使用 Roslyn 作为基础引擎。

我的代码生成器目前能够为解决方案生成一个新的 csproj,并且能够基于 VSIX 可扩展性的模板项目生成样板代码库。尽管我雄心勃勃,但我尽量不依赖静态模板项目,而是使用 Roslyn 来制作代码。

我的解决方案有一个文件夹列表,每个文件夹都有一个 csproj 列表。

我的问题 1 是我正在尝试使用 Roslyn Workspace API 来检测已在代码编辑器中打开的当前文档 (.cs),或者正在尝试获取我右键单击的所选 cs 文件的当前文档 ID解决方案浏览器。

我曾尝试使用 AdhocWorkspace,但由于我无法获得任何东西,所以到目前为止都失败了。

问题 2:如果我要使用 AdhocWorkspace,是否可以更改 csproj 属性中的默认命名空间?还是它目前不是 Roslyn Workspace API 功能的一部分?

谢谢。

最佳答案

对于 #1 的一些代码,我必须做同样的事情。我正在用光标做一些事情,所以我要通过 caretPosition(光标)。还有其他方法,但要点是相同的,获取当前的 TextView ,然后从那里转到 Roslyn。

您将需要安装 Microsoft.CodeAnalysis.EditorFeatures.Text,它引入了代码分析包的分配,但允许您使用他在 上应用的 GetOpenDocumentInCurrentContextWithChanges 扩展ITextSnapshot

private IVsEditorAdaptersFactoryService GetEditorAdaptersFactoryService()
{
IComponentModel componentModel =(IComponentModel)GetService(typeof(SComponentModel));
return componentModel.GetService<IVsEditorAdaptersFactoryService>();
}
private Microsoft.VisualStudio.Text.Editor.IWpfTextView GetTextView()
{
IVsTextManager textManager = (IVsTextManager)GetService(typeof(SVsTextManager));
if (textManager == null)
return null;
IVsTextView textView = null;
textManager.GetActiveView(1, null, out textView);
if (textView == null)
return null;
return GetEditorAdaptersFactoryService().GetWpfTextView(textView);
}

//code to get the doc
Microsoft.VisualStudio.Text.Editor.IWpfTextView textView = GetTextView();
if (textView != null)
{
SnapshotPoint caretPosition = textView.Caret.Position.BufferPosition;
Document document = caretPosition.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
//do stuff with Roslyn Document
}

“或者正在尝试获取我从解决方案资源管理器中右键单击的所选 cs 文件的当前文档 ID。”

这真的很难看,但我从另一个 SO 帖子(不记得作者)中使用的东西确实运行良好。

private static bool IsSingleProjectItemSelection(out IVsHierarchy hierarchy, out uint itemid)
{
hierarchy = null;
itemid = VSConstants.VSITEMID_NIL;
int hr = VSConstants.S_OK;

var monitorSelection = Package.GetGlobalService( typeof( SVsShellMonitorSelection ) ) as IVsMonitorSelection;
var solution = Package.GetGlobalService( typeof( SVsSolution ) ) as IVsSolution;
if (monitorSelection == null || solution == null)
return false;

IVsMultiItemSelect multiItemSelect = null;
IntPtr hierarchyPtr = IntPtr.Zero;
IntPtr selectionContainerPtr = IntPtr.Zero;

try
{
hr = monitorSelection.GetCurrentSelection( out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainerPtr );
if (ErrorHandler.Failed( hr ) || hierarchyPtr == IntPtr.Zero || itemid == VSConstants.VSITEMID_NIL)
return false;
// multiple items are selected
if (multiItemSelect != null)
return false;
// there is a hierarchy root node selected, thus it is not a single item inside a project
if (itemid == VSConstants.VSITEMID_ROOT)
return false;

hierarchy = Marshal.GetObjectForIUnknown( hierarchyPtr ) as IVsHierarchy;
if (hierarchy == null)
return false;

Guid guidProjectID = Guid.Empty;

if (ErrorHandler.Failed( solution.GetGuidOfProject( hierarchy, out guidProjectID ) ))
return false;

// if we got this far then there is a single project item selected
return true;
}
finally
{
if (selectionContainerPtr != IntPtr.Zero)
Marshal.Release( selectionContainerPtr );

if (hierarchyPtr != IntPtr.Zero)
Marshal.Release( hierarchyPtr );
}
}

IVsHierarchy hierarchy = null;
uint itemid = VSConstants.VSITEMID_NIL;
if (!IsSingleProjectItemSelection(out hierarchy, out itemid))
return;
string itemFullPath = null;
((IVsProject)hierarchy).GetMkDocument(itemid, out itemFullPath);
if (itemFullPath.EndsWith(".cs"))

关于c# - 罗斯林 : Get Current Project/Get Current Doc that is selected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218148/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com