首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Build.Evaluation.Project在VS中添加文件夹和文件强制刷新项目

Microsoft.Build.Evaluation.Project在VS中添加文件夹和文件强制刷新项目
EN

Stack Overflow用户
提问于 2015-09-04 00:10:48
回答 2查看 1.2K关注 0票数 4

我正在创建一个应用程序,将添加一些文件和文件夹,以现有的项目,这是加载在Visual studio中。这是可行的,但它始终会弹出一条消息,告诉用户(我)刷新项目以显示新文件。

当使用实体框架并添加迁移时,它会将一个文件添加到当前加载的项目中,并且不会询问用户。我希望能够做同样的事情。

这个是可能的吗?如果有人不知道答案,他们知道我会如何钻研EF并添加迁移,看看他们是如何做到的吗?

下面是我用来编辑项目文件的代码:

代码语言:javascript
复制
using Microsoft.Build.Evaluation;

 internal class ProjectFileHandler
    {
        private void AddMigrationFolder(Project project, string     projectFileLocation, string name)
        {
            var loc = Path.Combine(projectFileLocation.Substring(0, projectFileLocation.LastIndexOf("\\")), name);
            project.AddItem("Folder", loc);            
        }

        internal void AddMigrationFile(string projectfileLocation, string migrationFolderName, string fileLocation)
        {
            var project = new Project(projectfileLocation);
            AddMigrationFolder(project, projectfileLocation, migrationFolderName);

            project.AddItem("Compile", fileLocation);

            project.Save();
        }
    }
EN

回答 2

Stack Overflow用户

发布于 2016-08-29 20:54:54

很老了,但我会留下评论。也许这对其他人有帮助。

问题出在"project.Save();“

该解决方案将此视为“外部”更改。尝试不使用这一行的代码。

票数 0
EN

Stack Overflow用户

发布于 2021-05-06 02:32:13

甚至更老,但我今天必须解决这个问题,所以为了它的价值,这是我所做的。

首先,据我所知,在没有Visual Studio提示用户重新加载项目的情况下,您无法使用Microsoft.Build.Evaluation更新项目。您必须调用project.Save()将您的更新写入到项目XML中,Visual Studio会“看到”文件更改并显示提示。

您可以做的是使用EnvDTE而不是Microsoft.Build.Evaluation,这看起来就是实体框架所做的,尽管是with Powershell。EnvDTE可用于on NuGet,并且最新版本支持.NET Framework4.5和.NET标准2,因此它应该具有相当广泛的兼容性。

使用EnvDTE,您可以获得对Project对象的引用并调用AddFromFile(absoluteFilePath) -如果需要,还可以使用其他Add()方法。

如果您拥有项目的完整文件路径,则可以使用以下命令获取项目文件:

代码语言:javascript
复制
using System.Linq;
using System.Runtime.InteropServices;
using EnvDTE;

var dte = (DTE)Marshal.GetActiveObject("VisualStudio.DTE");

var project = dte
    .Solution
    .EnumerateProjects()
    .First(p => p.FullName == fullPathToProject);

...where EnumerateProjects()是以下扩展方法:

代码语言:javascript
复制
using EnvDTE;
using System.Collections;
using System.Collections.Generic;

internal static class EnvDteExtensions
{
    public static IEnumerable<Project> EnumerateProjects(
        this Solution solution)
    {
        return Enumerate(solution.Projects);
    }

    private static IEnumerable<Project> Enumerate(IEnumerable items)
    {
        foreach (var item in items)
        {
            var candidateProject = item;

            if (candidateProject is ProjectItem projectItem &&
                projectItem.SubProject != null)
            {
                candidateProject = projectItem.SubProject;
            }

            if (!(candidateProject is Project project))
            {
                continue;
            }

            yield return project;

            try
            {
                if (project.ProjectItems == null)
                {
                    continue;
                }
            }
            catch
            {
                continue;
            }

            foreach (var subProject in Enumerate(project.ProjectItems))
            {
                yield return subProject;
            }
        }
    }
}

EnvDTE中的Project实际上可能是一个项目,也可能是一个包含项目的解决方案文件夹-- candidateProject is ProjectItem projectItem && projectItem.SubProject != null检查处理后一种情况。

EnvDTE的Project.AddFromFile()在没有项目重新加载提示的情况下将文件弹出到解决方案资源管理器中。

最后,AddFromFile()似乎是幂等的,所以您可以将相同的文件垃圾发送到项目中,而不必担心它是否已经存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32380646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档