C# 如何在VS 2008中为一个C解决方案创建每个表单的独立可执行文件,该解决方案在一个构建中包含多个项目和多个表单?

C# 如何在VS 2008中为一个C解决方案创建每个表单的独立可执行文件,该解决方案在一个构建中包含多个项目和多个表单?,c#,visual-studio-2008,projects-and-solutions,C#,Visual Studio 2008,Projects And Solutions,我在VisualStudio2008中为给定的问题域提供了一个基于C的解决方案。此解决方案有1+5个项目。第一个项目是跨其他5个项目的资源 每个项目都有多种形式。默认情况下,构建为每个项目生成一个可执行文件。我更希望的是,每个表单都能生成一个独立的可执行文件,它与其他表单没有相互依赖关系 我知道我可以将5个主要项目分解为多个项目,并将Startup Project设置为多个Startup Project,从而实现我的目标。但随着项目数量增加到两位数左右,这将过度填充解决方案。我不想追求为5个项目

我在VisualStudio2008中为给定的问题域提供了一个基于C的解决方案。此解决方案有1+5个项目。第一个项目是跨其他5个项目的资源

每个项目都有多种形式。默认情况下,构建为每个项目生成一个可执行文件。我更希望的是,每个表单都能生成一个独立的可执行文件,它与其他表单没有相互依赖关系


我知道我可以将5个主要项目分解为多个项目,并将Startup Project设置为多个Startup Project,从而实现我的目标。但随着项目数量增加到两位数左右,这将过度填充解决方案。我不想追求为5个项目中的每一个都提供单独解决方案的路线

现在我调用应用程序。按如下方式运行以实现我的目标:

Application.Run(new fooForm());
当我需要为另一个独立表单创建可执行文件时,我将表单值更改为

Application.Run(new barForm());
等等,直到我需要再来一杯浓咖啡


如果我不需要跳出窗口就可以完成我想要的东西,那么有没有什么黑客软件?

Visual Studio中没有内置任何东西可以满足您的需要

有没有什么技巧可以让我不必跳出窗外就能实现我的目标


如果您正在进行黑客攻击,您可能希望在构建后步骤中运行ilasm.exe和ildasm.exe:根据您遵循的任何规则分解5个exe并将它们重新组装为>5个exe。

我建议创建一个template.csproj文件,并使用一个小型C或Perl程序创建其中的许多exe,使用基于解决方案中表单的值填充模板。然后可以使用批处理或Perl脚本聚合.csproj文件,以便从命令行使用devenv.exe进行编译


没有真正干净的方法。

也许您可以选择将每个项目的所有内容保留在一个EXE文件中,并在运行时决定从哪个表单开始。例如,您可以使用不同的名称复制EXE文件,从中确定EXE文件的名称

  Assembly.GetExecutingAssembly().Location
并使用此信息选择放入“Application.Run”的表单

或者,您不制作副本并使用适当的命令行参数调用EXE。这取决于用户如何在不同的数据库报告之间进行选择

编辑:以下是一个未经测试的简单示例:

[STAThread]
static void Main(string[] args)
{
    if(args.Length<1)
         return;
    if(args[0]=="Form1")
         Application.Run(new Form1());
    else if(args[0]=="Form2")
         Application.Run(new Form2());
}

使用Doc Brown对exe文件使用不同名称的想法,以下代码将使用与exe MyNamespace同名的表单运行应用程序。MyForm.exe将以MyNamespace.MyForm作为启动表单启动应用程序

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        string FullPath = Assembly.GetExecutingAssembly().Location;
        string ExeName = Path.GetFileNameWithoutExtension(FullPath);
        Type TypeBasedOnExeName = Assembly.GetExecutingAssembly().GetType(ExeName);
        Form StartupForm = (Form)Activator.CreateInstance(TypeBasedOnExeName);

        Application.Run(StartupForm);
    }
将Main函数添加到每个表单类中,并让它自己运行。 根据form/exe创建一个批处理文件,以使用命令行编译器csc.exe for C编译项目,指定要使用的主方法包含在哪个类表单中

public partial class Form2 : Form
{
  [STAThread]
  static void Main()
  {
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new Form2());
  }
}
使用以下方法编译form2的可执行文件:

csc.exe /out:Form2.exe Form2.cs Form2.designer.cs  /Main:WindowsFormsApplication1.Form2

将5个主要项目中的每一个分解为多个项目-这是使用Visual Studio生成多个EXE的唯一方法。您试图实现什么?项目中的每个表单都与单个数据库对话以生成一个报表,并且独立于该项目中的其他表单以及来自同一解决方案的其他项目中的任何其他表单。现在,这些可执行文件是通过替换Application.Run每次手动获取的值来创建的。我想要一种自动创建fooForm、barForm等可执行文件的方法,而无需手动执行。谢谢。将每个项目的所有内容都保存在一个.exe文件中是一个可行的选择。我将试验一下你建议的第一部分。你能给我一个例子,说明如何调用一个绑定了多个表单的.exe,根据命令行参数运行不同的表单吗?@SixlettVariables:我结合你的建议和Oliver John的建议,创建了一批适用于我的内容的脚本。你是对的,没有干净的路@蒂姆·罗宾逊:谢谢你的推荐。由于缺乏时间和熟练程度,我推迟了使用ilasm.exe、ildasm.exe的路线。@Oliver John:谢谢。我将你的建议和sixlettervariables结合起来,创建了一批适合我内容的脚本。