3

我试图找出一种在我的 WinForm 应用程序加载之前预处理一些事情的方法。我尝试将静态 void Main() 放在类库项目中的表单中,并从 Program.cs 中将其注释掉。这产生了一个编译时错误:“......不包含适合入口点的静态'Main'方法”。这是有道理的,因为没有加载程序,也没有加载 DLL。

所以问题是,有没有办法做到这一点?我希望 DLL 中的表单能够确定使用哪个表单启动应用程序:

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

   if(condition1)
   {
      Application.Run(new Form1());
   }
   else if(condition2)
   {
      Application.Run(new Form2());
   }
}

此逻辑将在多个应用程序中使用,因此将其放在一个通用组件中是有意义的。

4

5 回答 5

7

您可以在应用程序调用的 DLL 中添加一个静态方法,而不是在 main 中进行处理吗?

// In DLL
public static class ApplicationStarter
{
     public static void Main()
     {
          // Add logic here.
     }
}

// In program:
{
     [STAThread]
     public static void Main()
     {
          ApplicationStarter.Main();
     }
}
于 2009-08-31T19:21:34.610 回答
1

在 Program.cs 中保留 Main 方法。让它调用 dll 中的一个方法,该方法根据条件实例化一个 Form 并将其返回给 Main。

于 2009-08-31T19:21:03.550 回答
0

“static void Main”方法必须在“EXE”程序集中,但您可以让此方法调用共享程序集的“Main”版本。你不能直接做。

于 2009-08-31T19:20:03.067 回答
0

static void Main() 在类库中没有意义,但是如果放置在 Program.cs 中,您的代码片段应该完全符合您的要求。

此外,您是否需要一个包罗万象的“其他”子句,以防万一条件 1 和条件 2 不满足?可能不是必需的,但在大多数情况下,我希望得到某种形式的反馈,而不是应用程序静默退出——当然,这取决于你在做什么。

编辑:这可能会做你想做的事,如果你只是需要将逻辑分离到一个库中

// Program.cs
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    if(MyLib.Condition1)
    {
        Application.Run(new Form1());
    }
    else if(MyLib.Condition2)
    {
        Application.Run(new Form2());
   }
}


// MyLib.cs
...
public static bool Condition1
{
    get
    {
         return resultOfLogicForCondition1;
    }
}
public static bool Condition2
{
    get
    {
         return resultOfLogicForCondition2;
    }
}
于 2009-08-31T19:27:03.927 回答
0

本质上,您正在尝试为要用于应用程序的表单创建自定义工厂。类似于以下内容:

在 EXE 中:

static void Main()
{
    Application.Run(new Factory.CreateForm());
}

在您的图书馆中:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
于 2009-08-31T19:51:57.323 回答