问题描述
我正在测试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
。
问题是:
System.Runtime.InteropServices.COMException:'找不到指定的模板。请检查完整路径是否正确。'
该文件100%位于目录中。.理想情况下,我想避免自己创建Solution Items
文件夹并由API处理。.
-
在迭代解决方案项/项目时,我将这些项强制转换为类型
Project
,但是,在调试过程中,我看到该项也由类型System.__ComObject
和{{ 1}},但是无法将项目转换为2种类型中的任何一种。其他2种类型(或3种类型之间的相关性)是什么?我如何确切知道应该将解决方案项目转换为哪种类型? -
查找VS执行的命令的用例是什么?我已经下载了命令浏览器并捕获了
Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject
命令,但是我实际上如何使用这些知识从代码执行命令?命令如下所示:
我很高兴听到关于我上面提到的问题的一些解释。.到目前为止,我在VS扩展构建方面的经验-涉及很多谷歌搜索和反复试验。 )
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)