Jestem początkującym jeśli chodzi o programowanie, ale byłem pewien, że jedną z uniwersalnych zasad było to, że program zaczyna się od Main (). Nie widzę żadnego, gdy tworzę projekt WPF. Czy Main () jest po prostu nazwany inaczej w WPF?
Jestem początkującym jeśli chodzi o programowanie, ale byłem pewien, że jedną z uniwersalnych zasad było to, że program zaczyna się od Main (). Nie widzę żadnego, gdy tworzę projekt WPF. Czy Main () jest po prostu nazwany inaczej w WPF?
Odpowiedzi:
Jest generowany podczas kompilacji, ale możesz podać swój własny (ujednoznaczniając go we właściwościach projektu, jeśli to konieczne). Poszukaj w obj / debug pliku aplikacji; Mam (dzięki uprzejmości „C # 2010 Express”) App.g.i.cs
z:
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();
}
}
}
App.g.cs
również w programie. Ale próbowałem Main()
coś dodać i za każdym razem, gdy odbudowywałem swój projekt, wracał do tego, co masz tutaj. Próbowałem utworzyć własną w innej klasie, ale właściwości projektu znajdują tylko MyProject.App, a nie inną klasę, więc nie mogę go przekierować.
App.xaml.cs
w programie Visual Studio. Użyj paska nawigacji> Lista rozwijana Metoda> wybierz Main
(wyszarzona). To prowadzi do App.g.i.cs
.
Metoda Main () jest tworzona automatycznie. Jeśli chcesz udostępnić swój własny, musisz (przetestowany w VS2013 i VS2017):
Następnie po prostu dodaj metodę Main () do App.xaml.cs. Może to wyglądać tak:
[STAThread]
public static void Main()
{
var application = new App();
application.InitializeComponent();
application.Run();
}
Main()
jest automatycznie udostępniana przez środowisko CLR i WPF.
Kompilator C # przyjmuje przełącznik wiersza polecenia, /m
który określa typ zawierający implementację Main()
. Zgodnie z konwencją, jeśli nie określono jawnie żadnego obiektu startowego, środowisko CLR wyszuka każdą klasę, która ma Main()
metodę statyczną , i wywoła ją. (Jak zauważył @Marc Gravel w swoim komentarzu)
W przypadku WPF Main()
jest generowany automatycznie, gdyApp.xaml
jest kompilowany, a przełącznik / m jest określony, aby kompilator C # używał tej klasy jako punktu wejścia. Jeśli jednak spojrzysz na właściwości projektu, przekonasz się, że istnieje ustawienie umożliwiające wybranie obiektu startowego. Więc jeśli chcesz, możesz dostarczyć własną klasę, która implementujeMain()
.
Zwróć uwagę, że spowoduje to nałożenie na Ciebie odpowiedzialności za utworzenie Application
wystąpienia i wywołanie jego Run()
metody, aby zapewnić prawidłowe uruchomienie infrastruktury WPF.
/m
niego nie obchodzi, jak nazywa się typ; jeśli nie są jednoznaczne to po prostu stara się znaleźć żadnej odpowiedniej Main
metody, i narzeka, jeżeli stwierdzi 0 lub więcej niż jeden. Na przykład przykład „Hello World” w specyfikacji języka (§1.1) używa Hello
jako nazwy typu.
main()
jest dostarczane przez CLR (środowisko uruchomieniowe), tak naprawdę to kompilator go generuje.
MyApp.App app = new MyApp.App();
) I wywołać .Run()
ją, tak jak poprzednio Main()
. Dobra decyzja. Musiałbym również dodać app.InitializeComponent();
wcześniej app.Run()
i na szczęście dla nas oryginalna InitializeComponent()
metoda nadal istnieje (widoczna w App.g.cs, więc nie ma potrzeby dodawania jej z powrotem!).
main()
to standardowy punkt wejścia do aplikacji, ale wszystkie aplikacje mają taką strukturę. W projekcie XAML plik App.XAML określa punkt wejścia, w którym jest napisanyStartupUri="MainWindow.xaml"
.
Jak twierdzą inni, rzeczywista główna funkcja jest generowana na podstawie zawartości plików XAML w projekcie.
Skopiowałem pliki, które nie były ładowane w innym projekcie, który był bez głównego okna, do nowego i otrzymałem ten błąd.
W moim przypadku trzeba było zastosować odwrotne podejście do Andreasa Kahlera, aby naprawić:
Po utworzeniu pliku okna i ustawieniu startowego URI na ten plik przełączyłem Page na ApplicationDefinition we właściwości 'Build Action' App.xaml.
Jeśli usunąłeś domyślne App.xaml i MinWindow.xaml, lepiej edytować plik .csproj Po ręcznym dodaniu App.xaml, plik .csproj będzie:
<Page Include ="App.xaml">
<DependentUpon>MSBuild:Compile</DependentUpon>
<SubType>Code</SubType>
</Page>
Zmień to na:
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>