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

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

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


你确实可以做这种事情。我不认为有任何理由将Main()从你的WinForms可执行文件中移除。condition1、condition2等是如何设置的?有什么导致它没有产生预期结果的问题吗? - Eric J.
5个回答

7

你可以在DLL中添加一个静态方法,让应用程序调用该方法来执行处理,而不是在主函数中进行处理吗?

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

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

1

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


0

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


0

在类库中,static void Main() 没有意义,但是如果将您的代码片段放置在 Program.cs 中,它应该可以完全满足您的需求。

此外,您是否需要一个 catch-all 的 'else' 子句,以防 condition1 和 condition2 没有被满足?可能不是必需的,但在大多数情况下,我会期望得到某种形式的反馈,而不是应用程序默默退出 - 当然这取决于您正在做什么。

编辑:如果您只需要将逻辑分离到库中,则此代码可能可以满足您的需求。

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

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

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