【问题标题】:Compile entire project from another project从另一个项目编译整个项目
【发布时间】:2023-03-28 05:35:01
【问题描述】:

我有一个 Windows 窗体应用程序,我用它来生成资源文件。我正在尝试向此应用程序添加此类功能,这将允许我将另一个 Windows 窗体应用程序编译为可执行文件,其中包含这些资源。但是,我坚持编译另一个 Windows 窗体项目部分。

我尝试关注this article,目前我的代码如下所示:

CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.IncludeDebugInformation = true;
parameters.GenerateInMemory = false;
//parameters.TreatWarningsAsErrors = true;
parameters.WarningLevel = 3;
parameters.CompilerOptions = "/optimize";
parameters.OutputAssembly = "Program.exe";

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerResults results = codeProvider.CompileAssemblyFromFile(parameters, new string[] { "Program.cs" });

我不确定我是否正确执行此操作(如果我应该编译 Program.cs 文件)。 Program.cs 文件如下所示:

using System;
using System.Windows.Forms;

namespace example
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

当我尝试用上面的代码编译它时,我得到了这个错误:

Line number 16, Error Number: CS0246, 'The type or namespace name 'Form1' could not be found (are you missing a using directive or an assembly reference?)

如果你们能帮助我,我真的很感激,我从来没有从其他项目编译过任何东西。

【问题讨论】:

  • 你怎么能只编译一个文件并期望它工作?
  • 我认为你应该使用 CompileAssemblyFromFileBatch 传递所有文件,如 Program.cs 和 Form.cs 和 Form.Designer.cs 等等
  • 阅读编译器文档而不是“希望”。也就是说,只需致电 msbuild project.csproj 即可。

标签: c# compiler-construction csharpcodeprovider


【解决方案1】:

假设您要编译的另一个项目是 project.csproj,请参考 Microsoft.Build.Framework 并使用此代码:

var globalProperty = new Dictionary<string, string> { { "Configuration", "Debug"}, { "Platform", "Any CPU" } };
var buildParameters = new BuildParameters(new ProjectCollection()) { Loggers = new List<ILogger> { new ConsoleLogger() } };
var buildRequest = new BuildRequestData(@"C:\example\project.csproj", globalProperty, "4.0", new[] {"Build" }, null);
BuildResult buildResult = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequest);

或者你可以只包装 MsBuild.exe

var p = new Process(); 
p.StartInfo = new ProcessStartInfo(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe");
p.StartInfo.Arguments = @"C:\example\project.csproj";
p.Start();

【讨论】:

  • 感谢您的回答,但是在使用您的第一种方法时,buildResult.OverallResult 是失败的并且项目没有构建。
  • 这将是因为其他项目没有编译,而不是上面的代码。有什么错误?
  • 我得到 OutputPath 属性没有为项目'project.csproj'设置,但 project.csproj 文件看起来像这样pastebin.com/pvqXvm1N 所以使用配置|平台调试|应该设置任何 CPU。 .
  • 好的,我发现了错误,您的配置中的平台不应包含该空间,因此 AnyCPU 是正确的,而 Any CPU 不是。请修复它。感谢您的帮助,我会接受这个答案。
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 2017-08-23
  • 2018-03-10
  • 2012-12-13
  • 2013-12-30
  • 2021-07-25
  • 1970-01-01
  • 2014-07-03
相关资源
最近更新 更多