首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Microsoft.Build.Evaluation (而不是引擎)编程修改csproj文件

用Microsoft.Build.Evaluation (而不是引擎)编程修改csproj文件
EN

Stack Overflow用户
提问于 2014-04-09 09:13:34
回答 2查看 5.4K关注 0票数 7

我想读,修改和写回csproj文件。我找到了这段代码,但不幸的是,引擎类被折旧了。

代码语言:javascript
复制
Engine engine = new Engine()
Project project = new Project(engine);
project.Load("myproject.csproj");
project.SetProperty("SignAssembly", "true");
project.Save("myproject.csproj");

因此,我继续根据我应该使用Evaluation.ProjectCollection而不是Engine的提示:

代码语言:javascript
复制
var collection = new ProjectCollection();
collection.DefaultToolsVersion = "4.0";
var project = new Project(collection);

// project.Load("myproject.csproj") There is NO Load method :-(
project.FullPath = "myproject.csproj"; // Instead of load? Does nothing...

// ... modify the project
project.Save(); // Interestingly there is a Save() method

再也没有加载方法了。我试图设置属性FullPath,但该项目似乎仍然是空的。错过什么了吗?

(请注意,我确实知道.csproj文件是一个具有XSD模式的标准XML文件,并且我知道我们可以使用XDocument或XmlDocument来读写它。这是个后备计划。只要看到项目类上的.Save()方法,我想如果不能加载现有的.csproj,我就遗漏了一些东西。( thx)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-09 11:17:08

我已经找到了答案,希望能帮助到其他人:

而不是创建一个新项目(.)并试图.Load(.)它,我们应该使用ProjectCollection类的工厂方法。

代码语言:javascript
复制
// Instead of:
// var project = new Project(collection);
// project.FullPath = "myproject.csproj"; // Instead of load? Does nothing...

// use this:
var project = collection.LoadProject("myproject.csproj")
票数 10
EN

Stack Overflow用户

发布于 2020-03-06 09:46:41

因为我不能评论:

如果不首先设置.net路径变量,这在MSBuild.exe核心中是行不通的。这样做的代码可以在这里找到。

https://blog.rsuter.com/missing-sdk-when-using-the-microsoft-build-package-in-net-core/

写在这里

代码语言:javascript
复制
 private static void SetMsBuildExePath()
        {
            try
            {
                var startInfo = new ProcessStartInfo("dotnet", "--list-sdks")
                {
                    RedirectStandardOutput = true
                };

                var process = Process.Start(startInfo);
                process.WaitForExit(1000);

                var output = process.StandardOutput.ReadToEnd();
                var sdkPaths = Regex.Matches(output, "([0-9]+.[0-9]+.[0-9]+) \\[(.*)\\]")
                    .OfType<Match>()
                    .Select(m => System.IO.Path.Combine(m.Groups[2].Value, m.Groups[1].Value, "MSBuild.dll"));

                var sdkPath = sdkPaths.Last();
                Environment.SetEnvironmentVariable("MSBUILD_EXE_PATH", sdkPath);
            }
            catch (Exception exception)
            {
                Console.Write("Could not set MSBUILD_EXE_PATH: " + exception);
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22957913

复制
相关文章

相似问题

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