WinフォームアプリケーションでDLLへのエントリポイントを移動します
-
20-09-2019 - |
質問
私はいくつか私のWinFormアプリがロードされる前に前処理への道を把握しようとしています。私は、クラスライブラリプロジェクト内のフォームに静的な無効メイン()を入れてみましたとのProgram.csからそれをコメントアウト。これは、コンパイル時エラーが発生した:「...エントリポイントに適した静的な 『メイン』メソッドが含まれていません」。プログラムがロードされていないので、それはDLLのいずれかにロードされていない、理にかなっています。
質問があるだから、すべてでこれを行う方法はありますか?私は、DLLのフォームがでアプリケーションを起動するためにどの形式かを決定することができるようにしたい。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if(condition1)
{
Application.Run(new Form1());
}
else if(condition2)
{
Application.Run(new Form2());
}
}
このロジックは、それが一般的な構成要素でそれを置くことは理にかなっていますので、複数のアプリで使用されます。
解決
あなたは自分のアプリケーションではなく、メインの処理を行うので呼び出して、あなたのDLL内の静的メソッドを追加することはできますか?
// In DLL
public static class ApplicationStarter
{
public static void Main()
{
// Add logic here.
}
}
// In program:
{
[STAThread]
public static void Main()
{
ApplicationStarter.Main();
}
}
他のヒント
のProgram.csであなたMainメソッドを保管してください。それは条件に基づいてフォームをインスタンス化するDLL内のメソッドを呼び出し、メインに戻しましょう。
「静的な無効メイン」メソッドは、「EXE」のアセンブリ内にあることがありますが、この方法は、「メイン」の共有アセンブリのバージョンへの呼び出しを行う可能性があります。あなたは、直接それを行うことはできません。
静的な無効メイン()のProgram.csに配置された場合は、コードのスニペットは、あなたが望む正確に何をすべき、クラスライブラリに意味がありません。
また、あなたはキャッチオール「他」句が必要なのか、念の条件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;
}
}
基本的に、あなたは、アプリケーションで使用するフォームのカスタムファクトリーを作成しようとしています。以下のような何かます:
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();
}
}