使用 csc.exe 编译 Windows 窗体应用程序

Posted

技术标签:

【中文标题】使用 csc.exe 编译 Windows 窗体应用程序【英文标题】:Compile a Windows Forms application using csc.exe 【发布时间】:2017-02-04 09:57:28 【问题描述】:

Erik Brown 在他的书中写了以下代码 并从命令行编译它:

csc MyForm.cs

[assembly: System.Reflection.AssemblyVersion("1.1")]
namespace MyNamespace

    public class MyForm : System.Windows.Forms.Form
    
        public MyForm()
        
            this.Text = "Hello Form";
        

        public static void Main()
        
            System.Windows.Forms.Application.Run(new MyForm());
        
    

我想添加另一个表单并从第一个调用它。

我需要项目文件吗?汇编文件?我不明白构建过程。您能否向我解释一下最基本的内容:我如何告诉编译器构建一个包含两种形式的应用程序?

【问题讨论】:

这本书试图教给你的东西并不那么明显。但是这个代码在刑事上是错误的。使用 Visual Studio 项目模板来正确处理它。再买一本书。 @hans:请不要评判 99% 专注于视觉工作室的书,并举一个例子……满足我的独特需求。 嗯,我有权评判。一本教人非常糟糕的编程习惯的书不是一本好书。你的 UI 看起来像是来自上个世纪,这很容易看出。但是你看不到的是,当你继续前进时,你会遇到非常令人讨厌的无法诊断的失败。这里也没有人能够帮助你,他们不会知道这本书告诉你做错了。不要这样做。 【参考方案1】:

第一种形式(form1.cs):

public class MyForm : System.Windows.Forms.Form

    public MyForm()
    
        this.Text = "Hello Form";
        this.Click += Form_Click;
    

    public static void Main()
    
        System.Windows.Forms.Application.Run(new MyForm());
    

    private void Form_Click(object sender, System.EventArgs e)
    
        MyForm2 form2 = new MyForm2();
        form2.ShowDialog();
    

第二种形式(form2.cs):

 public class MyForm2 : System.Windows.Forms.Form
 
     public MyForm2()
     
         this.Text = "Hello Form 2";
     
 

现在从命令行,找到保存这些 .cs 文件的位置,然后运行:

csc form1.cs form2.cs

它将创建一个 EXE 文件。运行它并在表单中点击打开form2。

【讨论】:

谢谢。不敢相信它这么简单..我会尽快检查的。因此,如果 csc“知道”如何合并所有文件.. assemble 和 project 文件有什么好处? (只是好奇......你已经回答了我的问题)......谢谢 很高兴它有帮助。请点赞。 :) 如果您使用的是 Visual Studio,项目文件基本上是自动创建的。项目文件不是编写和编译 c# 程序的必需组件..【参考方案2】:

您需要使用 Visual Studio (VS) 命令提示符并提及项目中所有 Windows 窗体的 C# 代码文件名 (*.cs)。您必须包括每个表单的代码隐藏文件以及设计器代码隐藏文件。否则编译不会成功。

示例项目结构如下:

WindowsFormsApplication1.csproj
--Program.cs
--Form1.cs
----Form1.Designer.cs
--Form2.cs
----Form2.Designer.cs

上述项目的编译命令如下:

csc /target:winexe Program.cs Form1.cs Form1.Designer.cs Form2.cs Form2.Designer.cs

注意:编译时必须包含Program.cs文件,否则编译器无法获取项目的入口点(Main方法)。 /target 开关可帮助您将输出 EXE 文件作为基于 GUI 的 Windows 窗体应用程序启动。

上述命令有一个较短的版本,它使用通配符一次性包含所有文件名:

csc /target:winexe *.cs

最简单的替代方法是在 Visual Studio 命令提示符下使用 msbuild 命令代替 cscmsbuild 命令可用于构建项目文件,其中包含所有*.cs 文件的引用。下面是命令的样子:

msbuild WindowsFormsApplication1.csproj

这使我们不必单独提及所有 C# 代码文件名(无论是在项目根目录中还是嵌套的子目录中)。构建项目文件就完成了。

【讨论】:

这可以在没有 Windows 命令提示符的情况下完成,这就是重点。感谢您提供有关 *.cs 的更多信息。 ms build 似乎是更结构化的解决方案,但我只设法构建了一个薄模板来让我继续前进......我从来没有找到一个愚蠢的证明手册来向我展示高级选项:例子,图片;)......无论如何,谢谢...... 好的。伟大的。我还想突出显示/target 开关,它可以帮助您将输出 exe 作为 Windows 窗体应用程序启动。如果您不提及此开关,那么它将首先作为控制台应用程序启动,然后依次启动 Windows 应用程序。

以上是关于使用 csc.exe 编译 Windows 窗体应用程序的主要内容,如果未能解决你的问题,请参考以下文章

payload免杀之Installutil.exe&csc.exe利用

《CRL Via C#》使用CSC.exe对两个文件进行编译

将 Visual Studio 2012 配置为使用 Mono 的 C# 编译器,而不是默认的 csc.exe

C#使用命令编译代码

记事本写的C#程序如何运行?

csc.exe已退出,代码为-532462766