WPFにMain()はありませんか?


128

私はプログラミングに関しては初心者ですが、プログラムがMain()で始まるという共通のルールの1つだと確信していました。WPFプロジェクトを作成するときに表示されません。Main()はWPFで単に別の名前を付けていますか?


13
App.xaml.csでOnStartupをオーバーライドすることにより、同等の機能を取得できます。StartupEventArgs.Argsには、コマンドライン引数が含まれています。
Foole 2010

1
@Foole、いいえ、できません。この質問を参照してください。
Sinatr 2014年

回答:


73

ビルド時に生成されますが、独自に提供することもできます(必要に応じて、プロジェクトプロパティで明確化します)。obj / debugでアプリファイルを探します。私は( "C#2010 Express"の厚意により)以下をApp.g.i.cs持っています:

namespace WpfApplication1 {


    /// <summary>
    /// App
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public partial class App : System.Windows.Application {

        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public void InitializeComponent() {

            #line 4 "..\..\..\App.xaml"
            this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);

            #line default
            #line hidden
        }

        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public static void Main() {
            WpfApplication1.App app = new WpfApplication1.App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

1
同じことがにApp.g.csも存在します。しかし、私は追加しようとしましたMain()が、プロジェクトを再構築するたびに、ここにあるものに戻ります。別のクラスで独自のクラスを作成しようとしましたが、プロジェクトプロパティはMyProject.Appのみを検出し、他のクラスは検出しないため、リダイレクトできません。
vapcguy 2016年

1
または、App.xaml.csビジュアルスタジオで開きます。ナビゲーションバーを使用> [メソッド]ドロップダウンリスト>選択Main(グレー表示)。これはあなたを連れて行きますApp.g.i.cs
P.Brian.Mackey

136

Main()メソッドは自動的に作成されます。独自に提供する必要がある場合は、VS2013およびVS2017でテスト済みです。

  • ソリューションエクスプローラーでApp.xamlを右クリックし、[プロパティ]を選択します。
  • 「ビルドアクション」を「ページ」に変更します(初期値は「ApplicationDefinition」です)

次に、Main()メソッドをApp.xaml.csに追加します。次のようになります。

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}

2
[STAThread]は、アプリケーションのCOMスレッドモデルを設定します。通常、それをSTAに設定するだけで、正確に何をするかを心配する必要はありません。興味がある場合は、msdn.microsoft.com
Andreas Kahler

これを行わないでください!これにより、プロジェクト全体のデザイナーのスタイルのApp.xamlで定義されているStaticResourcesが完全に壊れます。
ヒムビア

13

Main() CLRとWPFによって自動的に提供されます。

C#コンパイラは、/mの実装を含む型を指定するコマンドラインスイッチを使用しますMain()。規約により、スタートアップオブジェクトが明示的に指定されていない場合、CLRは静的Main()メソッドを持つクラスを検索し、それを呼び出します。(@Marc Gravelがコメントで指摘したように)

WPFの場合、はビルドMain()時に自動的に生成App.xamlされ、C#コンパイラがそのクラスをエントリポイントとして使用するように/ mスイッチが指定されます。ただし、プロジェクトのプロパティを見ると、スタートアップオブジェクトを選択するための設定があります。したがって、必要に応じて、を実装する独自のクラスを提供できますMain()

これにより、Applicationインスタンスを作成し、そのRun()メソッドを呼び出して、WPFインフラストラクチャが適切に開始されていることを確認する必要があります。


実際には、/mそれがなければタイプが何と呼ばれるかはにしません。明示的でない場合は適切なMainメソッドを見つけようとし、0か1つ以上見つかった場合は文句を言います。例として、言語仕様(§1.1)の「Hello World」サンプルHelloはタイプ名として使用します。
Marc Gravell

2
簡潔に言うとmain()、CLR(ランタイム)によって提供されると言っても正確ではなく、実際にそれを生成するのはコンパイラーです。
ハンク

以前のように、自分のアプリケーションインスタンス(つまりMyApp.App app = new MyApp.App();)に追加して呼び出す必要がある聴衆を思い出させるために、私の+1を追加しました。よかった。また、以前に追加する必要がありますが、幸いなことに、元のメソッドはまだそこにあります(App.g.csに表示されているため、追加する必要はありません!)。.Run()Main()app.InitializeComponent();app.Run()InitializeComponent()
vapcguy 2016年

7

Main()コンパイル中に生成されます。あなたはそれを見つけることができますApp.g.cs(でobj/{Debug,Release}フォルダ)。


6

main()はアプリケーションの標準のエントリポイントですが、すべてのアプリケーションはそのように構成されています。XAMLプロジェクトでは、App.XAMLファイルは、それが言うエントリポイントを指定しますStartupUri="MainWindow.xaml"

他の人が述べているように、実際のメイン関数はプロジェクトのXAMLファイルの内容に基づいて生成されます。


1

メインウィンドウがない別のプロジェクトでロードできないファイルを新しいプロジェクトにコピーし、このエラーが発生しました。

私にとっては、Andreas Kahlerとは逆のアプローチで修正する必要がありました。

ウィンドウファイルを作成し、スタートアップURIをこのファイルに設定した後、PageをApp.xamlのApplicationDefinitionの 'Build Action'プロパティに切り替えました。


0

デフォルトのApp.xamlとMinWindow.xamlを削除した場合は、.csprojを編集することをお勧めします。App.xamlを手動で追加すると、.csprojは次のようになります。

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

これを次のように変更します。

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.