首页 文章

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

提问于
浏览
3

我试图找到一种方法来预先处理我的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

    你能在你的应用程序调用的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

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

  • 0

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

  • 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;
        }
    }
    
  • 7

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

    在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();
        }
    }
    

相关问题