从VisualStudio扩展中添加解决方案项

问题描述

我正在测试VisualStudio扩展,它将新项目添加解决方案中。我通过反复试验找到了解决问题的方法,但对这种解决方案的复杂性不满意,还有一些未解决的问题。这是代码

using EnvDTE;
using EnvDTE80;
//..

namespace MyFirstExtension
{
    internal sealed class AddFiletoSolution
    {
        public const int CommandId = PackageIds.CmdCreateVaultHelperConfig;
        public static readonly Guid CommandSet = new Guid(PackageGuids.guidVaultHelperVsExtensionPackageCmdsetString);
        private readonly AsyncPackage package;

        private AddFiletoSolution(AsyncPackage package,OleMenuCommandService commandService)
        {
            this.package = package ?? throw new ArgumentNullException(nameof(package));
            commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));

            var menuCommandID = new CommandID(CommandSet,CommandId);
            var menuItem = new MenuCommand(this.Execute,menuCommandID);
            commandService.AddCommand(menuItem);
        }

        public static AddFiletoSolution Instance { get; private set; }

        private Microsoft.VisualStudio.Shell.IAsyncServiceProvider ServiceProvider { get { return this.package; } }

        public static async Task InitializeAsync(AsyncPackage package)
        {
            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(package.disposalToken);

            OleMenuCommandService commandService = await package.GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService;
            Instance = new AddFiletoSolution(package,commandService);
        }

        private async void Execute(object sender,EventArgs e)
        {
            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            string fileFullPath = @"C:\Users\myusr\source\repos\VsExtensionTesting2\0.txt";
            
            var dte = await package.GetServiceAsync(typeof(DTE));
            var dte2 = dte as DTE2;

            var solution2 = (Solution2)dte2.solution;
            
            // following line throws Exception!
            //solution2.AddFromFile(fileFullPath);

            bool isSolutionItemsFolderExists = IsSolutionItemsFolderExists(solution2);
            if (!isSolutionItemsFolderExists)
            {
                solution2.AddSolutionFolder("Solution Items");
            }

            AddToSolutionItems(solution2,fileFullPath);
        }

        public bool IsSolutionItemsFolderExists(Solution2 solution2)
        {
            foreach (var solutionItemObj in solution2)
            {
                var solutionItem = solutionItemObj as Project;

                string name = solutionItem.Name;
                if (name == "Solution Items")
                {
                    return true;
                }
            }

            return false;
        }

        public void AddToSolutionItems(Solution2 solution2,string fileFullPath)
        {
            foreach (var solutionItemObj in solution2)
            {
                var solutionItem = solutionItemObj as Project;

                string name = solutionItem.Name;
                if (name == "Solution Items")
                {
                    solutionItem.ProjectItems.AddFromFile(fileFullPath);
                }
            }
        }
    }
}

在这里,我正在使用Visual Studio 2019 VSIX项目模板。认情况下,它使用AsyncPackage。我要完成的工作是在Project.AddExistingItem级执行命令solution

enter image description here

问题是:

  1. 在我的解决方案中-为什么调用命令solution2.AddFromFile(fileFullPath);直接引发异常?

System.Runtime.InteropServices.COMException:'找不到指定的模板。请检查完整路径是否正确。'

文件100%位于目录中。.理想情况下,我想避免自己创建Solution Items文件夹并由API处理。.

  1. 在迭代解决方案项/项目时,我将这些项强制转换为类型Project,但是,在调试过程中,我看到该项也由类型System.__ComObject和{{ 1}},但是无法将项目转换为2种类型中的任何一种。其他2种类型(或3种类型之间的相关性)是什么?我如何确切知道应该将解决方案项目转换为哪种类型?

  2. 查找VS执行的命令的用例是什么?我已经下载了命令浏览器并捕获了Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject命令,但是我实际上如何使用这些知识从代码执行命令?命令如下所示:

enter image description here

我很高兴听到关于我上面提到的问题的一些解释。.到目前为止,我在VS扩展构建方面的经验-涉及很多谷歌搜索和反复试验。 )

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)