Ostatnio spotkałem się z pytaniem: “Jak kompiluję projekt to VisualStudio pyta się czy zmienić plik moja_klasa.g.cs. Wszędzie go szukałem ale nie znalazłem. Co to &#@!* jest?”
Szybko więc odpowiadam, ale zacznijmy od małego wstępu 🙂
Pisząc aplikacje, wykorzystując WPF tworzymy między innymi widoki, które definiuje XAML. Tworząc nowe okno, UserControl czy bądź cokolwiek innego VisualStudio stworzy nam 2 pliki jeden z nich to nowy_widok.xaml oraz nowy_widok.xaml.cs.
Podczas kompilacj naszego projektu w katalogu wyjściowym VisualStudio tworzy 2 katalogi obj i bin.
W katalogu obj\Debug.. \Release.. ? znajduje się właśnie ten dziwny plik z rozszerzeniem g.cs. Czym on jest?
W tym samym katalogu można zauważyć pliki z rozszerzeniem baml. Są to dokładnie nasze “widoki i inne xamlowe cosie” zapisane binarnie (zserializowane). Dzięki temu nasze widoki wczytywane są o wiele szybciej. To tak w wielkim skrócie 🙂
Lecz czym jest …g.cs?
Jest to klasa generowana automatycznie, która zawiera w sobie:
- poszczególne pola dla wszystkich kontrolek, które są zawarte w widoku
- kod, który ładuje BAML’a z określonego assembly
- wszystkie handlery i tego typu rzeczy, które dotyczą naszych kontrolek wykorzystywanych w widoku
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
#pragma checksum "..\..\MainWindow.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "4C9D8134CAEDBE7AA2D8FBE0E0950072" //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.34014 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ using System; using System.Diagnostics; using System.Windows; using System.Windows.Automation; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Effects; using System.Windows.Media.Imaging; using System.Windows.Media.Media3D; using System.Windows.Media.TextFormatting; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Shell; namespace WpfApplication2 { /// <summary> /// MainWindow /// </summary> public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { #line 8 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox log; #line default #line hidden private bool _contentLoaded; /// <summary> /// InitializeComponent /// </summary> [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] public void InitializeComponent() { if (_contentLoaded) { return; } _contentLoaded = true; System.Uri resourceLocater = new System.Uri("/WpfApplication2;component/mainwindow.xaml", System.UriKind.Relative); #line 1 "..\..\MainWindow.xaml" System.Windows.Application.LoadComponent(this, resourceLocater); #line default #line hidden } [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { switch (connectionId) { case 1: #line 6 "..\..\MainWindow.xaml" ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Button_Click); #line default #line hidden return; case 2: #line 7 "..\..\MainWindow.xaml" ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Button_Click1); #line default #line hidden return; case 3: this.log = ((System.Windows.Controls.TextBox)(target)); return; } this._contentLoaded = true; } } } |
Więc każda zmiana w XAML spowoduje, że VisualStudio (jeżeli macie otwarty plik …g.cs) podczas kompilacji poinformuje nas o zmianach w tym pliku.
Czym jest samo “g“? 😀
Sam nie wiedziałem. Podobno jest to skrót od generated 😉