Tworząc aplikację WPF czasami zachodzi potrzeba napisania własnej metody Main(). Przeglądając pliki znajdujące się w solucji można natknąć się pliki *.xaml i powiązanie z nimi *.xaml.cs oraz pliki kodu *.cs. Dopóki nie trzeba zrobić czegoś nie standardowego to często nie ma potrzeby, aby zagłębiać się w różnego rodzaju mechanizmy. Takim mechanizmem może być start aplikacji WPF.
Ostatnio potrzebowałem dodać własną metodę Main(). Sądziłem, że będzie to proste – nowa klasa i odpowiedni kod. Oczywiście wcześniej sprawdziłem, czy nie ma tej metody już zdefiniowanej w plikach solucji.
Kompilując program otrzymałem następujący błąd:
Error 1 Program …\WpfApplication1\WpfApplication1\obj\x86\Debug\WpfApplication1.exe’ has more than one entry point defined: 'WpfApplication1.Program.Main()’. Compile with /main to specify the type that contains the entry point. …\WpfApplication1\WpfApplication1\Program.cs 15 28 WpfApplication1
Error 2 Program …\WpfApplication1\WpfApplication1\obj\x86\Debug\WpfApplication1.exe’ has more than one entry point defined: 'WpfApplication1.App.Main()’. Compile with /main to specify the type that contains the entry point. …\WpfApplication1\WpfApplication1\obj\x86\Debug\App.g.cs 61 28 WpfApplication1
Podwójne kliknięcie drugiego błędu otworzyło plik App.g.cs, który znajduje się w katalogu obj\x86\Debug:
/// <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();
}
}
I jak się okazało znajduje się w nim metoda public static void Main(). W sytuacji, gdy nie można znaleźć tego pliku należy przebudować solucję ponieważ plik ten jest generowany automatycznie w trakcie kompilacji. Takie zachowanie powoduje, że każda zmiana w tym pliku będzie nadpisywany w trakcie każdorazowej kompilacji kodu.
Przejdźmy do sedna problemu. Aby użyć własnej metody Main() należy wykonać dwie czynności:
- wskazać miejsce gdzie znajduje się interesująca metoda Main() – należy zmienić parametr Application -> Startup object we właściwościach projektu,

- wyłączyć automatyczne generowanie metody Main() poprzez zmianę właściwości Build Action dla App.xaml z ApplicationDefinition na Page.
Po wprowadzeniu tych dwóch zmian aplikacja powinna nam się skompilować bez problemu.



Zostaw komentarz