如何在 Visual Studio SDK 中移动文档并确保通知任何源代码控制提供程序

Posted

技术标签:

【中文标题】如何在 Visual Studio SDK 中移动文档并确保通知任何源代码控制提供程序【英文标题】:How do you move documents within the Visual Studio SDK and ensure any source control providers are notified 【发布时间】:2021-08-06 11:26:27 【问题描述】:

我正在尝试编写一个 VSIX 插件,它可以自动执行在 Visual Studio 2017 C++ 项目中移动文件的过程。到目前为止,我已经尝试了以下方法,不幸的是没有奏效。该文件在磁盘上移动,并且相关的 VCFile 会相应地更新,但是源代码控制提供程序(在这种特殊情况下为 P4V)不会像我期望的那样检查文件并自动执行移动。 我也尝试过使用 IVsTrackPProjectDocuments2 服务的 OnQueryRename 和 OnAfterRename 方法。这种方法的问题是这两种方法都需要 IVsProject 。我一直无法弄清楚如何从我拥有的 VCProject 引用中解析对关联 IVsProject 的引用。非常感谢了解该领域的人提供的任何帮助!

// These variables are resolved outside the scope of this method and passed in
string oldFileLocation;
string newFileLocation;
VCProject containingProject;

IVsTrackProjectDocuments3 documentTrackingService = await asyncServiceProvider.GetServiceAsync(typeof(IVsTrackProjectDocuments3)) as IVsTrackProjectDocuments3;
int methodSucceeded = documentTrackingService.HandsOffFiles((uint)__HANDSOFFMODE.HANDSOFFMODE_DeleteAccess, 2, new string[]  oldFileLocation, newFileLocation );

// If the method did not succeed then we cannot continue
if (methodSucceeded != VSConstants.S_OK)

     return;

            
// Now move the file on disk and update the relative path of the file
await Task.Run(() =>  File.Move(oldFileLocation, newFileLocation); );

// Store the old relative path for rollback
string oldRelativePath = movedFile.RelativePath;
movedFile.RelativePath = GetRelativePath(containingProject.ProjectDirectory, newFileLocation);

methodSucceeded = documentTrackingService.HandsOnFiles(2, new string[]  oldFileLocation, newFileLocation );

// If the method did not succeed then we need to roll back
if (methodSucceeded != VSConstants.S_OK)

     // Now move the file on disk and update the relative path of the file
     await Task.Run(() =>  File.Move(newFileLocation, oldFileLocation); );
     movedFile.RelativePath = oldRelativePath;

【问题讨论】:

【参考方案1】:

好吧,进一步调查我意识到您可以简单地在 VCFile 上调用“AddFile”来触发移动:

await Task.Run(() =>  File.Move(oldFileLocation, newFileLocation); );
movedFile.AddFile(newFileLocation);

【讨论】:

以上是关于如何在 Visual Studio SDK 中移动文档并确保通知任何源代码控制提供程序的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin对Visual Studio用户免费 Xamarin SDK将开源

Visual Studio2015设置Android SDK路径

如何将 Astra sdk 与 Visual Studio 2013 C# 集成?

如何让2017年的Visual Studio看到android 7?

将 Visual Studio 2017 与 .Net Core SDK 3.0 一起使用

如何让 Visual Studio 2015 安装程序知道我已经拥有 Android SDK?