CおよびCLRv2.0に関する興味深いメモ



メモの第2郚を.NETに投皿するずきが来たした。

構成ファむルには埩venが必芁です。
* .CONFIG-アプリケヌションを本圓に蚭定できたすか

タむツ
Mark R. "Procmon.exe"から有名なナヌティリティを起動し、テストりィンドりアプリケヌションを起動しおすぐに閉じ、むベントの収集を停止したす。 受信したログで、アプリケヌションを名前でフィルタリングしたすInclude。 衚瀺される内容は次のずおりです。

1)   config: 22:09:36.0364337 WindowsFormsApplication1.exe 7388 QueryOpen S:\WindowsFormsApplication1.exe.config NAME NOT FOUND 2)   INI: 22:09:36.0366595 WindowsFormsApplication1.exe 7388 QueryOpen S:\WindowsFormsApplication1.INI NAME NOT FOUND 3)   Local: 22:09:36.0537481 WindowsFormsApplication1.exe 7388 QueryOpen S:\WindowsFormsApplication1.exe.Local NAME NOT FOUND 


PowerGUIがEXEにコンパむルされるPowerShellスクリプトの構成ファむルを䜿甚しおいるこずを偶然発芋したしたパスワヌドで保護したり、すぐにサヌビスを䜜成するこずもできたす。
ファむル自䜓Untitled.exeおよびUntitled.exe.config。

 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> <supportedRuntime version="v2.0.50727" /> </startup> <runtime> <loadFromRemoteSources enabled="true"/> </runtime> </configuration> 

.INI-アセンブリを最適化する必芁がないこずをJITコンパむラに䌝えるこずができたす。 したがっお、リリヌスでは、MSILを最適化でき、2぀の異なるビルドを䜿甚せずに、このファむルを介しおJITを管理できたす。

 [.NET Framework Debugging Control] GenerateTrackinglnfo = 1 AllowOptimize = 0 

.Local- ダむナミックリンクラむブラリのリダむレクト

ゞョン・ロビンスのゞョヌク
プロセスが芋える別の堎所がありたす。
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \珟圚のバヌゞョン\むメヌゞファむル実行オプション\

レゞストリキヌMyApp.EXEを䜜成し、その䞭に新しい文字列倀Debuggerを䜜成したす。ここで、デバッガぞのフルパスある堎合を瀺し、calc.exeを蚘述したす。

これで、MyApp.EXEを起動しようずするず、蚈算機が実際に起動したす。

1少しのC履歎
異なるバヌゞョンで远加されたもの
C2.0
ゞェネリック、null蚱容型、匿名メ゜ッド、デリゲヌトの匷化、反埩的なyieldブロック。 郚分型、静的クラス、異なるアクセス修食子を持぀プロパティ、名前空間゚むリアスロヌカルでWinForms = System.Windows.Formsを䜿甚、グロヌバルに-FirstAlias :: DemoおよびSecondAlias :: Demo、プラグマディレクティブ、安党でないコヌドの固定サむズバッファヌ固定バむトデヌタ[20]。

C3.0
LINQ、自動プロパティ、配列ずロヌカル倉数の暗黙的な型指定、宣蚀の堎所でのオブゞェクトずコレクションの初期化子、匿名型。 匏ラムダず匏ツリヌ、拡匵メ゜ッド、郚分メ゜ッド。

C4.0
名前付き匕数、オプションのパラメヌタヌ、䞀般化されたバリ゚ヌション、動的型。

C5.0
非同期/埅機、foreachルヌプの倉曎、呌び出し元コンポヌネントに関する情報の属性。


2メモリ内の参照型のむンスタンスの最小サむズ。
x86およびx64の堎合
空のクラスを䜜成したす。
 class MyClass { } 

32ビットでコンパむルし、Windbgのサむズを調べたす。
 0:005> !do 023849bc Name: ConsoleApplication1.MyClass MethodTable: 006c39d4 EEClass: 006c1904 Size: 12(0xc) bytes -   . File: E:\...\ConsoleApplication1.exe Fields: None 

64ビットでコンパむルしたす。
 0:003> !do 0000007c8d8465b8 Name: ConsoleApplication1.MyClass MethodTable: 00007ffa2b5c4320 EEClass: 00007ffa2b6d2548 Size: 24(0x18) bytes File: E:\...\ConsoleApplication1.exe Fields: None 

最初の4バむトたたは8バむトはオブゞェクトのタむトルワヌドであるため、小さくなりたせん。 同期、ガベヌゞコレクタのオヌバヌヘッドの保存、ファむナラむズ、ハッシュコヌドの保存に䜿甚されたす。 このフィヌルドの䞀郚のビットは、各特定の瞬間にどの情報が栌玍されるかを決定したす。
2番目の4バむトたたは8バむトは、メ゜ッドテヌブルぞのリンクです。
デヌタずアラむメント甚の3番目の4バむトたたは8バむトたずえそれらに䜕もない堎合でも。
x86の参照型のむンスタンスの合蚈最小サむズは12バむトで、x64は24バむトです。


3メモリヌ内のクラスのむンスタンスの非静的フィヌルドおよびメ゜ッドx64。
1぀のフィヌルドず自動プロパティを远加したす
 class MyClass { private string _field1 = "Some string 1"; public string Field2 { get; set; } } 

IL 2぀のフィヌルドがありたす。
 .field private string '<Field2>k__BackingField' .field private string _field1 

そしお2぀の方法
 .method public hidebysig specialname instance string get_Field2() cil managed .method public hidebysig specialname instance void set_Field2(string 'value') cil managed 

誰がどこに着いたか芋おみたしょう
 0:003> !do 0000005400006600 Name: ConsoleApplication1.MyClass MethodTable: 00007ffa2b5c4378 EEClass: 00007ffa2b6d2548 Size: 32(0x20) bytes File: E:\...\ConsoleApplication1.exe Fields: MT Field Offset Type VT Attr Value Name 00007ffa89d60e08 4000002 8 System.String 0 instance 0000005400006620 _field1 00007ffa89d60e08 4000003 10 System.String 0 instance 00000054000035a0 <Field2>k__BackingField 


フィヌルドはむンスタンスに盎接到達し、その最小サむズに圱響したした最初のリンクは17から24ビット以前は空でしたで32で、2番目の25-32シヌケンスの順序を保持するために属性です。しかし、メ゜ッドは盎接むンスタンスはなく、それらぞのリンクのみが存圚するため、サむズに圱響したせんでした。

メ゜ッドの衚を芋おみたしょう
 0:003> !dumpmt -md 00007ffa2b5c4378 EEClass: 00007ffa2b6d2548 Module: 00007ffa2b5c2fc8 Name: ConsoleApplication1.MyClass mdToken: 0000000002000003 File: E:\...\ConsoleApplication1.exe BaseSize: 0x20 ComponentSize: 0x0 Slots in VTable: 7 Number of IFaces in IFaceMap: 0 -------------------------------------- MethodDesc Table Entry MethodDesc JIT Name 00007ffa89ae6300 00007ffa896980e8 PreJIT System.Object.ToString() 00007ffa89b2e760 00007ffa896980f0 PreJIT System.Object.Equals(System.Object) 00007ffa89b31ad0 00007ffa89698118 PreJIT System.Object.GetHashCode() 00007ffa89b2eb50 00007ffa89698130 PreJIT System.Object.Finalize() 00007ffa2b6e0390 00007ffa2b5c4358 JIT ConsoleApplication1.MyClass..ctor() 00007ffa2b5cc130 00007ffa2b5c4338 NONE ConsoleApplication1.MyClass.get_Field2() 00007ffa2b5cc138 00007ffa2b5c4348 NONE ConsoleApplication1.MyClass.set_Field2(System.String) 

そしお、ここでは、コンストラクタヌず、.NETのむンストヌル時にNgen自身がSystem.Objectから継承したむンスタンスメ゜ッドを陀いお、どちらもただJITコンパむルに合栌しおいたせん。

この段萜の終わりに、フィヌルドで瀺されるオブゞェクトのサむズずずもにむンスタンスのフルサむズを芋おいきたす。
 MyClass mcClass = new MyClass(); mcClass.Field2 = "Some string 2"; 0:003> !objsize 0000005400006600 sizeof(0000005400006600) = 144 (0x90) bytes (ConsoleApplication1.MyClass) 

フィヌルドのサむズを芋お、これを確認したしょう。
 0:003> !objsize 0000005400006620 sizeof(0000005400006620) = 56 (0x38) bytes (System.String) 0:003> !objsize 00000054000035a0 sizeof(00000054000035a0) = 56 (0x38) bytes (System.String) 

合蚈56 + 56 + 32 = 144。


4静的フィヌルドずメ゜ッドx64。
タむツ
 class MyClass { private string _name = "Some string"; public static string _STR = "I'm STATIC"; public static void ImStaticMethod() { } } MyClass mcClass = new MyClass(); Console.WriteLine(MyClass._STR); 

最小むンスタンスサむズ静的フィヌルドは考慮されたせん
 0:003> !do 00000033ba2c65f8 Name: ConsoleApplication1.MyClass MethodTable: 00007ffa2b5b4370 EEClass: 00007ffa2b6c2550 Size: 24(0x18) bytes File: E:\...\ConsoleApplication1.exe Fields: MT Field Offset Type VT Attr Value Name 00007ffa89d60e08 4000002 8 System.String 0 instance 00000033ba2c6610 _name 00007ffa89d60e08 4000003 10 System.String 0 static 00000033ba2c35a0 _STR 

方匏リスト
 0:003> !dumpmt -md 00007ffa2b5b4370 EEClass: 00007ffa2b6c2550 Module: 00007ffa2b5b2fc8 Name: ConsoleApplication1.MyClass mdToken: 0000000002000003 File: E:\...\ConsoleApplication1.exe BaseSize: 0x18 ComponentSize: 0x0 Slots in VTable: 7 Number of IFaces in IFaceMap: 0 -------------------------------------- MethodDesc Table Entry MethodDesc JIT Name 00007ffa89ae6300 00007ffa896980e8 PreJIT System.Object.ToString() 00007ffa89b2e760 00007ffa896980f0 PreJIT System.Object.Equals(System.Object) 00007ffa89b31ad0 00007ffa89698118 PreJIT System.Object.GetHashCode() 00007ffa89b2eb50 00007ffa89698130 PreJIT System.Object.Finalize() 00007ffa2b6d0110 00007ffa2b5b4350 JIT ConsoleApplication1.MyClass..cctor() 00007ffa2b6d03f0 00007ffa2b5b4348 JIT ConsoleApplication1.MyClass..ctor() 00007ffa2b5bc130 00007ffa2b5b4338 NONE ConsoleApplication1.MyClass.ImStaticMethod() 

ConsoleApplication1.MyClass..cctor-静的フィヌルドに目を向けたため、静的コンストラクタヌが実行されたした。 型コンストラクタずも呌ばれ、正確に呌び出されたずきは䞍明です。 静的フィヌルドの存圚䞋で自動的に䜜成されたす。 その䞭でアクションを実行する必芁がない堎合は、明瀺的に凊方しない方が良いでしょう。 これにより、メタデヌタのbeforefieldinitフラグを䜿甚しお最適化が行われたす。 詳现msdn.microsoft.com/ru-ru/library/dd335949.aspx

サむズを確認しおください
 0:003> !objsize 00000033ba2c65f8 sizeof(00000033ba2c65f8) = 72 (0x48) bytes (ConsoleApplication1.MyClass) 0:003> !objsize 00000033ba2c6610 sizeof(00000033ba2c6610) = 48 (0x30) bytes (System.String) 

合蚈24 + 48 = 72。
メ゜ッドのような静的フィヌルドは、各むンスタンスのコピヌに保存されたせん。


5芪ず、ガベヌゞコレクションからむンスタンスを保持する人を芋぀けたす。
ヒヌプ甚
3ポむントからのデヌタずアドレス。
 0:003> !dumpclass 00007ffa2b6c2550 Class Name: ConsoleApplication1.MyClass mdToken: 0000000002000003 File: E:\...\ConsoleApplication1.exe Parent Class: 00007ffa89684908 Module: 00007ffa2b5b2fc8 Method Table: 00007ffa2b5b4370 Vtable Slots: 4 Total Method Slots: 6 Class Attributes: 100000 Transparency: Critical NumInstanceFields: 1 NumStaticFields: 1 MT Field Offset Type VT Attr Value Name 00007ffa89d60e08 4000002 8 System.String 0 instance _name 00007ffa89d60e08 4000003 10 System.String 0 static 00000033ba2c35a0 _STR 

私たちは芪に行きたす
 0:003> !dumpclass 00007ffa89684908 Class Name: System.Object mdToken: 0000000002000002 File: C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Parent Class: 0000000000000000 -  . Module: 00007ffa89681000 Method Table: 00007ffa89d613e8 Vtable Slots: 4 Total Method Slots: a Class Attributes: 102001 Transparency: Transparent NumInstanceFields: 0 NumStaticFields: 0 

mcClass = new MyClassを保持しおいる人
 0:003> !gcroot 00000033ba2c65f8 Thread 3310: 00000033b81fedb0 00007ffa2b6d031f ConsoleApplication1.Program.Main rbx: -> 00000033ba2c65f8 ConsoleApplication1.MyClass 

真実のように聞こえたす。


6Foreachは誰ですか。
タむツ
1. foreachを䜿甚するず、非衚瀺のロヌカル倉数ルヌプむテレヌタヌが䜜成されたす。

2. IDeachposableむンタヌフェむスが実装されおいる堎合、foreachステヌトメントはルヌプの最埌でDisposeを自動的に呌び出したす。

3. GetEnumerator、MoveNextメ゜ッドの呌び出し、およびCurrentプロパティの呌び出しにコンパむルされたす。

4. Foreachは、yield returnず同様に、遅延反埩です。たずえば、mogogigabyteファむルを䞀床に1行ず぀読み取り、メモリを節玄する堎合に非垞に䟿利です。

5.配列のForeachは、Lengthプロパティず配列むンデクサヌを䜿甚し、むテレヌタヌオブゞェクトを䜜成したせん。

6. C5では、foreachルヌプ内でキャプチャされた倉数が正しく機胜するようになりたしたが、C3およびC4は倉数の1぀のむンスタンス最埌のみをキャプチャしたす。


7LINQ
クラッツ
1. LINQ to Objectは、通垞のデリゲヌトむンプロセスク゚リずしおJITで実行され、LINQ to SQLは匏ツリヌを構築し、SQLたたは他の環境で既に実行しおいたす。 ツリヌはデリゲヌトに倉換できたす。

2. LINQ to ObjectsのOrderByでは、すべおのデヌタをロヌドする必芁がありたす。

3. LINQ to ObjectsでJoinを䜿甚するず、右偎のシヌケンスがバッファリングされたすが、巊偎ではストリヌムが線成されたす。したがっお、倧きなシヌケンスを小さなシヌケンスに接続する必芁がある堎合、小さなシヌケンスを正しいシヌケンスずしお指定するず䟿利です。

4. EnumType.Selectx => x-これは瞮退ク゚リ匏ず呌ばれ、結果は芁玠のシヌケンスであり、゜ヌス自䜓ではありたせん。これはデヌタの敎合性の芳点から重芁です。 適切に蚭蚈されたLINQデヌタプロバむダヌに有効です。


8コレクション。
クリックしお
リストT-配列を内郚的に保存したす。 新しい芁玠を远加するには、配列に倀を蚭定するか、既存の配列を2倍の倧きさ文曞化されおいないの新しい配列にコピヌしおから倀を蚭定したす。 リストTからアむテムを削陀するには、その埌ろのアむテムを元の䜍眮にコピヌする必芁がありたす。 RemoveAtむンデックスにより、削陀はRemove倀よりもはるかに高速です各芁玠はどこにでも比范されたす。

配列のサむズは垞に固定されおいたすが、芁玠に関しおは可倉です。

LinkedList Tは、新しいアむテムをすばやく削陀、挿入できるリンクリストです。むンデックスはありたせんが、効率は維持されたす。

ReadOnlyDictionaryは、明瀺的なむンタヌフェむス実装の背埌にあるすべおの可倉操䜜を隠す単なるラッパヌです。 基瀎に転送されたコレクションを通じお芁玠を倉曎するこずが可胜です。


9オプションのメ゜ッドパラメヌタ。
ネタバレ
 void Method1( int x ) { x = 5; } IL: .method private hidebysig instance void Method1(int32 x) cil managed { // Code size 4 (0x4) .maxstack 8 IL_0000: ldc.i4.5 IL_0001: starg.sx IL_0003: ret } // end of method TestClass::Method1 void Method ( int x = 5 ) { } IL: .method private hidebysig instance void Method([opt] int32 x) cil managed { .param [1] = int32(0x00000005) // Code size 1 (0x1) .maxstack 8 IL_0000: ret } // end of method TestClass::Method 

int xは定数です。 たた、定数はメタデヌタに盎接栌玍されたす。぀たり、定数を倉曎するには、このメ゜ッドを䜿甚しおすべおのコヌドを再コンパむルする必芁がありたす。 2぀の゜ヌス、413ペヌゞ。

C4以降、名前付き匕数が䜿甚されおいる堎合、メ゜ッドパラメヌタヌの名前を倉曎するず他のコヌドに圱響を䞎える可胜性がありたす。


10.NETプラットフォヌム䞊のアプリケヌションの最適化
ヘヌサヌクリック
1. パフォヌマンスカりンタヌ 。
カりンタヌは1秒間に数回しか曎新されず、パフォヌマンスモニタヌ自䜓は1秒間に1回より倚くカりンタヌ倀を読み取るこずはできたせん。

2. Windows ETWのむベントトレヌス 。
これは、高性胜のむベント登録フレヌムワヌクです。

ETWからむベントを読み取りたす。
a Windowsパフォヌマンスツヌルキット 。
b PerfMonitor 。 Microsoftのオヌプン゜ヌスCLRプロゞェクト。
c PerfView 。 Microsoftの無料のHarvester。

3.メモリプロファむラヌ組み蟌みのVSに加えお CLRプロファむラヌ 。
既存のプロセス4.0以䞊のCLRに接続するか、新しいプロセスを開始するこずができ、メモリ割り圓おずガベヌゞコレクションのすべおのむベントを収集したす。 倚数のグラフを䜜成したす。

マルチスレッドアプリケヌションの誀動䜜の䞀般的なパタヌン 。


11同期。
タむク
 lock ( obj ) { } 

オンデマンドでのみ実行され、時間がかかりたす。 CLRは、グロヌバル配列「同期ブロックテヌブル」に構造「同期ブロック」を䜜成し、匱いリンクリサむクル甚によるロックを所有するオブゞェクトぞのリンクず、Win32むベントに実装されたモニタヌぞのリンクを持っおいたす。 同期ブロックの数倀むンデックスは、オブゞェクトのヘッダヌワヌドに栌玍されたす。 同期オブゞェクトが砎棄された堎合、同期ナニットずの接続は別のオブゞェクトで再利甚するために䞊曞きされたす。

しかし、すべおがそれほど単玔なわけではなく、ただ薄いロックがありたす。 同期ブロックがただ䜜成されおおらず、䞀方のスレッドのみがオブゞェクトを所有しおいる堎合、もう䞀方は実行しようずしお、オブゞェクトヘッダヌワヌドから所有者情報が消えるたでしばらく埅機したす。これが発生しない堎合、シンロックは通垞に倉換されたす。


12パッキング。
nパッケヌゞ
構造は次のずおりです。
 public struct Point { public int X; public int Y; } List<Point> polygon = new List<Point>(); for ( int i = 0; i < 10000000; i++ ) { polygon.Add( new Point() { X = rnd.Next(), Y = rnd.Next() } ); } Point point = new Point { X = 5, Y = 7 }; bool contains = polygon.Contains( point ); 

1号機を発売したす。

次に、メ゜ッドを远加したす。
 public override int GetHashCode() { return (X & Y) ^ X; //  . } public override bool Equals( object obj ) { if ( !( obj is Point ) ) return false; Point other = ( Point ) obj; return X == other.X && Y == other.Y; } public bool Equals( Point other ) { return X == other.X && Y == other.Y; } 

2番を開始したす。

次に、むンタヌフェヌスの実装を远加したすすでに適切なメ゜ッドがありたす
 public struct Point : IEquatable<Point> { ... } 

3号機を発売したす。
リストTにはIEquatable Tむンタヌフェむスの実装はありたせん

匿名タむプを詊したす。
 var someType = new { Prop1 = 2, Prop2 = 80000 }; var items = Enumerable.Range( 0, 10000000 ) .Select( i => new { Prop1 = i, Prop2 = i+i } ) .ToList(); items.Contains(someType); 

4号機を発売したす。
コンパむラヌは、someTypeの型が拡匵メ゜ッドの型ず同䞀であるため、問題がなかったこずを発芋したした。

たずめ
テスト結果


そしお、ILの匿名型は次のようになりたす。


興味があれば、メモリ内でsomeTypeはどのように芋える
 var someType = new { Prop1 = 2, Prop2 = 80000 }; 0:005> !do 0000008da2745e08 Name: <>f__AnonymousType0`2[[System.Int32, mscorlib],[System.Int32, mscorlib]] MethodTable: 00007ffa2b5b4238 EEClass: 00007ffa2b6c2548 Size: 24(0x18) bytes File: E:\...\BoxingUnboxingPointList.exe Fields: MT Field Offset Type VT Attr Value Name 0...0 4000003 8 System.Int32 1 instance 2 <Prop1>i__Field 0...0 4000004 c System.Int32 1 instance 80000 <Prop2>i__Field 

倀タむプには、倀自䜓2および80,000が栌玍されたす。

メ゜ッド衚
 0:005> !dumpmt -md 00007ffa2b5b4238 EEClass: 00007ffa2b6c2548 Module: 00007ffa2b5b2fc8 Name: <>f__AnonymousType0`2[[System.Int32, mscorlib],[System.Int32, mscorlib]] mdToken: 0000000002000004 File: E:\...\BoxingUnboxingPointList.exe BaseSize: 0x18 ComponentSize: 0x0 Slots in VTable: 7 Number of IFaces in IFaceMap: 0 -------------------------------------- MethodDesc Table Entry MethodDesc JIT Name 0...8 0...0 NONE <>f__AnonymousType0`2[[...]].ToString() 0...0 0...8 NONE <>f__AnonymousType0`2[[...]].Equals(System.Object) 0...8 0...0 NONE <>f__AnonymousType0`2[[...]].GetHashCode() 0...0 0...0 PreJIT System.Object.Finalize() 0...0 0...8 NONE <>f__AnonymousType0`2[[...]]..ctor(Int32, Int32) 0...8 0...0 NONE <>f__AnonymousType0`2[[...]].get_Prop1() 0...0 0...8 NONE <>f__AnonymousType0`2[[...]].get_Prop2() 

私はたた䜕か他のものを芋るこずを期埅しおいたした:)


13非同期/埅機
圌はより倧きく
非同期-生成されたコヌドには衚珟がありたせん。
埅機-有限状態マシン、構造。 このタむプの䌚議の時点たでに䜜業の結果がすでに利甚可胜な堎合、メ゜ッドは結果を同期モヌドで匕き続き凊理したす。 倀がtrueのTask TResult.ConfigureAwaitメ゜ッドは、継続を元のキャプチャされたコンテキストにマヌシャリングしようずしたす。これが䞍芁な堎合は、falseを䜿甚したす。

アレクサンダヌからこのトピックに関する玠晎らしい無料ビデオレッスン。

たた、蚘事「 SynchronizationContext-MSDNが倱敗したずき 」の翻蚳を読むこずも非垞に良いこずです。


14ガベヌゞコレクション
タむク
「0」䞖代の固定オブゞェクトを䜿甚する堎合、CLRはこの䞖代が叀いず宣蚀し、自分で新しい䞖代を遞択できたす。

䞖代「1」は「0」からのみアクセスでき、ファむナラむズされたオブゞェクトは間違いなくそこにありたす。

「2」䞖代のサむズは人為的に制限されおおらず、䜿甚可胜なすべおのメモリが䜿甚されたすWindowsはCLRず共有できたすが、GCはそれがいっぱいになるのを埅たず、しきい倀を䜿甚したすこれはわかりたせん。

マヌキングフェヌズでは、ラむブずしおマヌクされたオブゞェクトはリンクを倱い、1぀のアセンブリを生き残るこずができたす。

ラヌゞオブゞェクトヒヌプには85 kbを超えるオブゞェクトが含たれおいたすが、これはグラフ含たれおいるオブゞェクトではなく1぀のオブゞェクトを参照しおいたす。 䞖代「2」に関連付けられお、䞀緒になりたす。


゜ヌス
1John Robbins「Microsoft .NETおよびMicrosoft Windows甚のアプリケヌションのデバッグ」。
2ゞョン・スキヌト「CforProfessionals。TheSubtleties of Programming」、第3版。
3Sasha Goldstein、Dima Zurbalev、Ido Flatov「.Netプラットフォヌムでのアプリケヌション最適化」。

倚くの手玙が刀明したしたが、JITコンパむラヌは埌で䜿甚できたす。
ご枅聎ありがずうございたした。

Source: https://habr.com/ru/post/J260047/


All Articles