2009-08-31 63 views
3

我想弄清楚在我的WinForm應用程序加載之前預先處理一些東西的方法。我嘗試在類庫項目中將靜態void Main()放入一個表單中,並從Program.cs中將其註釋掉。其中產生了編譯時錯誤:「...不包含適用於入口點的靜態'Main'方法」。這是有道理的,因爲程序沒有加載,也沒有加載DLL。在WinForm應用程序中移動DLL的入口點

所以問題是,有沒有辦法做到這一點?我想在DLL的形式能夠確定與啓動應用程序,其形式爲:

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

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

此邏輯將在一個以上的應用程序,所以它是有道理的把它放在一個共同的組件中使用。

+0

你當然可以做這種類型的東西。我沒有看到任何理由從WinForms可執行文件中刪除Main()。 condition1,condition2等是如何設置的?發生了什麼讓你說它沒有給出預期的結果? – 2009-08-31 19:21:52

回答

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

「static void Main」方法必須位於「EXE」程序集內,但您可以使用此方法調用共享程序集版本的「Main」。你不能直接做。

1

讓你保持Program.cs中的Main方法。讓它在dll中調用一個方法,該方法根據條件實例化一個Form並將其返回給Main。

0

static void Main()在類庫中沒有意義,但是如果放在Program.cs中,代碼片段應該完全按照您的要求進行操作。

另外,你是否需要一個全面的'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(); 
    } 
}