Visual Studio 应用程序中的主要方法有超过两种吗?

22

在我的项目中,我有两个签名相同的Main方法。一个是WinForm,另一个是控制台类。

如何将它们中的任何一个设置为入口点?

我在一个主方法之前声明了[STAThread]以设置入口点,但它不起作用?

我正在使用Visual Studio Express 2010。


1
[STAThread] 属性不用于入口点。 - santosh singh
8个回答

32

通过在解决方案资源管理器中右键单击项目并选择属性,进入项目属性。在第一个选项卡中,您将看到一个下拉列表,用于选择入口点。选择适当的主方法。


1
我没有得到任何下拉列表。只有(未设置)在那里。如果所有类型都相同(无论是窗口还是控制台),那么我们就可以得到它。但是我的项目既有表单又有控制台。 - PawanS
3
它被标记为“启动对象”。这是一个来自新控制台应用程序的屏幕截图。http://www.screencast.com/t/27JwRJ0F - Josh
1
谢谢,我明白了。现在,在重建解决方案后,我得到了下拉列表。但是,“输出类型”我必须设置。它可以是控制台类型或Windows应用程序。 - PawanS

8
STAThread不会设置入口点 - 它强制运行时使用单线程公寓来执行 Main 线程。正如 Josh 所说,您需要在项目属性中设置启动对象。如果在 VS Express 中没有显示,您可能需要强制显示高级生成属性:打开“工具”\“选项”,并在“项目和解决方案”中选中“显示高级生成配置”。请注意,您的应用程序必须是控制台应用程序或 WinForms 应用程序之一。它只能构建为一个(无论如何每个配置都是这样)。当您将其作为 WinForms 应用程序启动时,它会显示控制台,而当您将其作为控制台应用程序启动时,它将不会显示控制台。您考虑过将大部分逻辑放在类库中,然后创建两个包装器应用程序,一个是 WinForms,一个是控制台,它们只显示相关 UI,然后委托给类库吗?

你说得对。我找到了解决方案,只需一次构建表单或控制台即可。不,我还没有尝试过你的想法。你能详细说明一下吗?谢谢。 - PawanS
@Pawan:你需要更多的细节吗?使用三个项目:一个类库,一个WinForms应用程序,一个控制台应用程序。从每个控制台应用程序和WinForms应用程序中添加对类库的引用,这是您放置大部分逻辑的地方。 - Jon Skeet
实际上,您可以将其构建为Windows EXE,然后有条件地显示控制台(基于命令行参数或其他内容),使用AllocConsole,但这有点复杂,并且具有一些不良副作用。如果您感兴趣,请参阅此帖子。https://dev59.com/okzSa4cB1Zd3GeqPk0DL - Josh
@Josh:是的,我试图保持事情相对简单 :) - Jon Skeet

4
如果程序有两个main方法,编译器会混淆,因此运行C#程序时,请指定主类。
public Class one

{
public static void main()
{
System.console.writeline("One");
}

public Class two
{
public static void main()
{
System.console.writeline("Two");
}
}

在控制台中运行C#代码

CSC Multimain.cs /main:one

  • 输出 One

CSC Multimain.cs /main:two

  • 输出 Two

很好的建议,可以使用VS命令提示符手动运行C#文件。我认为OP想在VS本身中使用它。 - Kira

2
你可以在每个声明的类中放置一个Main方法。一些程序员利用这一点在每个声明的类中构建一个小测试应用程序。
但是,如果在项目的多个类中声明了不止一个Main方法,则需要指定IDE哪一个应该成为应用程序的入口点。操作步骤如下:
1. 在Visual Studio中打开项目,选择“项目> [项目名称]属性...”(其中[项目名称]是您的项目名称)。
2. 从“启动对象”列表框中选择包含应该成为入口点的Main方法的类。

0

你也可以用这种方式,但我不知道如何设置哪个主方法将成为入口点

 public static void Main(string args)
    {
        Console.WriteLine("this is second main method");
    }

   public static void Main(string[] args)
    {
        Program.Main("second main method");
   }

0

你可以在一个程序中放置多个主方法,但只有一个主方法的程序会被编译,例如: 将此代码复制粘贴到编辑器中,并更改第一行中的名称“Release”,然后查看更改。

#define Release 
using System;
class Program
{  
#if Release==true
    public static void Main(string[] args) //for enemy
    {     
        Console.WriteLine("go to  hell");
        Console.ReadLine();
    }


#elif Release==false
    static void Main(string[] args) //for friend
    {    

         Console.WriteLine("hello ");

        Console.ReadLine();
    }

#endif 
}

0

这个问题可以通过以下步骤轻松解决: 1. 打开解决方案 2. 将两个类分割成单独的类文件 3. 从主菜单栏中点击“项目”选项卡 4. 将光标移动到属性上 5. 选择您想要运行的所需类名作为“引用路径” 6. 编译项目,错误将被消除。


-1
我觉得这个不会起作用。它甚至无法编译,还会抱怨项目有两个主方法。项目中只能有一个public static main方法。你必须重新命名/删除第二个方法。
顺便问一下,为什么你要保留两者?

没错,对于两个主要方法,它在VS中感到不确定性,这是入口点。那就是我的问题:如何设置特定的入口点?一个让用户在控制台或窗口中检索数据的项目。 - PawanS
不是这样的。你可以在一个项目中拥有两个主要方法。 - basarat
嗯,我的意思是我们可以有...但是哪一个是入口点很重要。 - PawanS
1
-1,因为这是完全可能的。我经常为演讲做这件事 - 我有一个入口点来查找其他人。 - Jon Skeet
@Jon Skeet:我可以接受有多个。但是,你怎么找到其他人呢?只是好奇... - Kanini
@Kanini:我正在寻找静态的Main方法,这些方法要么没有参数,要么有一个String[]参数。代码在MiscUtil中作为ApplicationChooser - 请参见http://pobox.com/~skeet/csharp/miscutil。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接