私はこれが少し新しいので、我慢してください。私は現在C#とJavaを学んでおり、それらの類似点の1つは、メイン関数をクラス内にカプセル化する必要があることです。たとえば、
public class HelloWorld {
public static void main(String[] args) {
// Some Code
}
}
今、私はあなたがプログラムを実行するとき、メインがしばしば「エントリーポイント」であることを理解しています。したがって、基本的には、メイン関数が存在する場所であればどこでもプログラムの実行が開始されます。しかし、どちらの言語でも、複数のクラス内で複数のメイン関数を使用できると考えています。それでは、複数のメイン関数を含むプロジェクトをコンパイルするとき、「エントリポイント」はどこにありますか?コンパイラは、どこから始めればよいのかをどのように知っていますか?
.NETでは、コンパイル時に使用するMainメソッドを含むクラスを定義できます。
http://msdn.Microsoft.com/en-us/library/x3eht538.aspx
Javaでは、jarにバンドルする場合、jarのマニフェストでエントリポイントを定義できます。
http://docs.Oracle.com/javase/tutorial/deployment/jar/appman.html
Javaでは、コンピューターは、コンパイル時ではなく、実際にプログラムを実行したときに「エントリーポイント」を決定します。たとえば、コマンドラインから
_Java MyClass
_
MyClass
でmain()
を検索します。他のすべてのmain()
関数は無視されます。
IDEを使用している場合、使用するmain()
関数を含むクラスを設定できます。
C#では、複数のMain
メソッドを使用できます。
複数のMain
メソッドが存在する場合、コンパイラは使用するエントリポイントを認識しないため、エラーが表示されます。
あなたは Main
メソッドを指定 コンパイル時に使用する必要があります:どのメソッドを使用するかを指定できますVisual Studio開発環境またはcscコンパイラーでコンパイラーオプションとして使用されます。
メインクラスは、1つだけの理由で特別なクラスです。Java Virtual Machineを実行すると、その関数はJVMが呼び出すものです。基本的に他の関数と同じであり、実際にはあるクラスのメイン関数を別のクラスから呼び出します。
複数のクラスを含むプロジェクトをコンパイルするとき、使用するメインクラスでクラスを実行するようにJVMに指示します。
Java SomeClass
また、SomeClassがコンパイルされ、適切なコンパイル済みファイルがクラスパスにあると仮定して、SomeClassのメインメソッドを実行します。 (これは特定のOSで解決する必要があるものですが、-cpオプションでクラスパスを指定するのはかなり一般的だと思います)。したがって、この:
Java -cp /home/MyName Someclass
ディレクトリ/ home/MyNameでSomeClassのメイン関数を実行します
C#では、_/main:
_コンパイラオプションを使用してエントリポイントを指定します。
2つのmain()
関数を含む次のコードを検討してください。
_namespace Application {
class ClassOne {
static void main () {
// Code here
}
}
class ClassTwo {
static void main () {
// Code here
}
}
}
_
ClassOne.main()
をエントリポイントとして使用するには、コンパイル時に次を指定します。
_csc /main:Application.ClassOne hello.cs
_
複数のメイン関数の場合、エントリポイントは次のように宣言できます。
Visual Studio開発環境でこのコンパイラオプションを設定するには
プロジェクトの[プロパティ]ページを開きます。
[アプリケーション]プロパティページをクリックします。
Startupオブジェクトプロパティを変更します。
Javaでは、他の人が指摘したように、Java
コマンドを実行するときにメイン関数を含むクラスを定義します。
ただし、Java -jar my.jar
で実行できる実行可能jarも作成できます。この場合、jarのフォルダーMANIFEST.MF
にあるMETA-INF
というマニフェストファイルが必要です。このファイルでは、ステートメントMain-Class: YourClass
を使用して、メイン関数を含むクラスを指定します。
メインメソッドは静的です。つまり、オブジェクトではなくクラスに属します。そのため、オブジェクトの内部には別のメインメソッドがまったくありません。 mainは静的であるため、追加のmainメソッドはありません。したがって、クラスごとに1回です。
プロジェクトに複数のメインメソッドがある場合、アプリケーションの起動時に起動するメインメソッドを指定します
実際、たとえば、WindowsのPE形式やLinuxまたは他のシステムのELF形式などのバイナリファイルでは、バイナリファイルのヘッダーは開始アドレスがどこにあるかを指定し、1つのみ存在できます。
どちらがエントリポイントになりますか?リンカに依存します。 @SetFreeByTruthが言ったように、コマンドラインパラメーターで指定できると言っています。多くのリンカは、コマンドラインパラメータでエントリポイントを指定することをサポートしています。たとえば、gnuのgldはパラメーター-eを使用してエントリポイントを指定できます。
Javaの動作はわかりません。なぜなら、それはJava仮想マシンによってロードされるからです。