【问题标题】:Moving entry point to DLL in a WinForm app在 WinForm 应用程序中将入口点移动到 DLL
【发布时间】:2010-11-24 10:39:45
【问题描述】:

我正试图找出一种方法来在我的 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());
   }
}

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

【问题讨论】:

  • 你当然可以做这种事情。我看不出有任何理由从 WinForms 可执行文件中删除 Main()。如何设置条件1、条件2等?发生了什么让您说它没有给出预期的结果?

标签: c# dll entry-point


【解决方案1】:

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

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

// In program:
{
     [STAThread]
     public static void Main()
     {
          ApplicationStarter.Main();
     }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        另外,您是否需要一个包罗万象的“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;
            }
        }
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-03
            • 2013-02-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            相关资源
            最近更新 更多