将入口点移动到WinForm应用程序中的DLL

时间:2009-08-31 19:16:58

标签: c# dll entry-point

我想在WinForm应用加载之前想办法预处理一些事情。我尝试将static 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());
   }
}

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

5 个答案:

答案 0 :(得分: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();
     }
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

另外,你是否需要一个全能'else'子句,以防万一不满足条件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;
    }
}

答案 4 :(得分: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();
    }
}