Windowsã©ã³ã¿ã€ã ã¡ã¿ããŒã¿
å éšçã«ãWinRTã³ã³ããŒãã³ãã¯COMïŒã³ã³ããŒãã³ããªããžã§ã¯ãã¢ãã«ïŒã³ã³ããŒãã³ãã§ãããã¡ã¿ããŒã¿ã䜿çšããŠAPIãèšè¿°ããããã«ãªããŸããã ãã®ã¡ã¿ããŒã¿ã¯ã* .winmdæ¡åŒµåã®ãã¡ã€ã«ã«ä¿åããã ECMA-335æšæºã®ã»ã¯ã·ã§ã³2ïŒã¡ã¿ããŒã¿ã®å®çŸ©ãšã»ãã³ãã£ã¯ã¹ïŒã®ã«ãŒã«ã«åŸã£ãŠãšã³ã³ãŒãããã.NETã¡ã¿ããŒã¿ã®æŽæ°ããŒãžã§ã³ãè¡šããŸãã éåžžã®.NET Frameworkã¢ã»ã³ããªã¯åãæšæºã䜿çšããŠãšã³ã³ãŒããããããããããã®ãã¡ã€ã«ã®å 容ã衚瀺ããã«ã¯ã䜿ãæ £ããããŒã«ïŒ ildasm.exe ãObject Browserãªã©ïŒã䜿çšã§ããããšã瀺åããŠããŸãã
ã»ãšãã©ã®å Žåã ildasm.exeãŠãŒãã£ãªãã£ã§WinMDãã¡ã€ã«ã衚瀺ããããšã¯ãæšæºã®ãããŒãžã¢ã»ã³ããªã衚瀺ããããšã«éåžžã«äŒŒãŠããŸãã ç®ã«èŠããããã€ãã®éãããããŸã-äž»ã«WinMDãã¡ã€ã«ã«ã¯äžè¬ã«ãäžéèšèªïŒILïŒåœä»€ãå«ãŸããŠããŸããã 代ããã«ããããã®ãã¡ã€ã«ã¯Windowsã©ã³ã¿ã€ã ã«ãã£ãŠæäŸãããAPIãèšè¿°ããŠããŸãã ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯ããããã®å®çŸ©ããå®å šã«åé¢ããããšãã§ããå®éã«ã¯ããã·ã³ã³ãŒãã§èšè¿°ããããšãã§ããŸãã ãã ãããããŒãžã¢ããªã±ãŒã·ã§ã³ã®éçºè ã«ãšã£ãŠã¯ããããŒãžã³ãŒããåŒã³åºãAPIå®çŸ©ã®ã¿ãåç §ããå¿ èŠããããããWinRT APIã®å®è£ ã®è©³çŽ°ã¯ç¡é¢ä¿ã§ãã èå°è£ã§ã¯ãå ±éèšèªã©ã³ã¿ã€ã ïŒCLRïŒãšWindowsãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãAPIå®çŸ©ãšãã®å®è£ ãæ¥ç¶ããŸãã
ããšãã°ãWindows.Foundation.winmdã¡ã¿ããŒã¿ãã¡ã€ã«ïŒïŒ WinDirïŒ \ System32 \ WinMetadataãã£ã¬ã¯ããªã«ãããŸãïŒã§ã¯ã次ã®çš®é¡ã®Windows.Foundation.Collections.PropertySetãèŠã€ããããšãã§ããŸãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ãæ¬äœãå«ãŸããŠããŸããã
ãã ãããã®ã¿ã€ããèšè¿°ããã¡ã¿ããŒã¿ã«ãããã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããããšãã«CLRãå®è£ ã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãã
Windowsã©ã³ã¿ã€ã ã¡ã¿ããŒã¿ã衚瀺ãããšãåãšã¢ã»ã³ããªã®å®çŸ©ã§æ°ããWindowsRuntimeããŒã¯ãŒãã䜿çšãããŠããããšã«ãæ°ä»ãããšãã§ããŸãã
ãã®ããŒã¯ãŒãã¯ã³ã³ããã¹ãäŸåã§ããã䜿çšå Žæã«ãã£ãŠè§£éãç°ãªããŸãã ããšãã°ãåå®çŸ©ïŒTypeDefïŒãããŒã¯ãŒãã§ããŒã¯ãããŠããå Žåããã®åã¯Windowsã©ã³ã¿ã€ã åã·ã¹ãã ã®èŠåã«åŸãããã®åã®åŒã³åºãã¯WinRT APIã®åŒã³åºããšèŠãªãããå¿ èŠããããŸãã
WinRTã³ã³ããŒãã³ããšCLRã®çžäºäœçš
CRLã¯ã ã©ã³ã¿ã€ã åŒã³åºãå¯èœã©ãããŒïŒRCWïŒããã³COMåŒã³åºãå¯èœã©ãããŒïŒCCWïŒã©ãããŒãä»ããCOMã³ã³ããŒãã³ããšã®å¯Ÿè©±ããµããŒãããŸãã ãããã£ãŠãCLRã§ã¯ãWinRTãªããžã§ã¯ããžã®ãªã³ã¯ã¯RCWãžã®ãªã³ã¯ã§ããã RCWã«ã¯WinRTãªããžã§ã¯ããžã®ãªã³ã¯ãå«ãŸããŠããŸãã ãããã£ãŠããããŒãžã³ãŒãã¯ãåºæ¬çã«ã³ãŒããšWinRTãªããžã§ã¯ãéã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ããRCWãšããåãããŸãã
åæ§ã«ãWindowsã©ã³ã¿ã€ã ã§ã¯ãCLRãªããžã§ã¯ããžã®ãªã³ã¯ã¯CCWãžã®ãªã³ã¯ã§ããã CCWã«ã¯CLRãªããžã§ã¯ããžã®ãªã³ã¯ãå«ãŸããŠããŸãã Windowsã©ã³ã¿ã€ã ã¯CCWãšå¯Ÿè©±ããŠã管ç察象ãšã³ãã£ãã£ã®æ©èœã«ã¢ã¯ã»ã¹ããŸãã
WinRTã®çš®é¡ãšãããŒãžã³ãŒã
Windowsã©ã³ã¿ã€ã åã·ã¹ãã ã¯CLRåã·ã¹ãã ã«äŒŒãŠããŸãããWinMDãã¡ã€ã«ã泚ææ·±ãèŠããšãAPIå®çŸ©ã§äœ¿çšãããŠããåã®äžéšããããŒãžã³ãŒãã§äœ¿çšãããŠããåãšäžèŽããªãããšãããããŸãã .NETéçºè ã䜿ãæ £ãããã¯ãããžã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæã§ããããã«ãCLRã¯ããã€ãã®çš®é¡ã®WinRTãé ããä»ã®çš®é¡ã®WinRTãžã®ã¢ã¯ã»ã¹ãæäŸããŠããŸãã äžè¬ã«ãWindowsã©ã³ã¿ã€ã ã«ã¯3çš®é¡ã®ã¿ã€ããããããããã®äžéšã¯ãããŒãžã³ãŒãã§ã¯ç°ãªã£ãŠèŠããŸãã
- ãããŒãžã¢ã»ã³ããªãšåãELEMENT_TYPEåæã䜿çšããŠã¡ã¿ããŒã¿ã«ãšã³ã³ãŒããããäž»èŠãªããŒã¿å ã äŸå€ã¯SByteã¿ã€ãã§ãWinRTã§ã¯ãµããŒããããŠããŸããã
- æ圱åïŒããããããåïŒ ãWinMDãã¡ã€ã«ã§ã¯1ã€ã®åãšããŠãšã³ã³ãŒããããŸããããããŒãžã³ãŒãã§ã¯.NETã«çžåœãããã®ãšããŠè¡šç€ºãããŸãã ããšãã°ãCLRãã¡ã¿ããŒã¿ã§Windows.Foundation.Uriãèªã¿åãå Žåã代ããã«System.Uriåã䜿çšããŸãã ã€ãŸããCLRã¯WinRTåãé ããå¥ã®åãä»ããŠWinRTåãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã ããã«ãCLRã¯ãããŒãžã³ãŒããšã¢ã³ãããŒãžã³ãŒãã®éã§åãããŒã·ã£ãªã³ã°ããããã System.Uriãªããžã§ã¯ããWindows.Foundation.UriãšããŠWindowsã©ã³ã¿ã€ã ã«è»¢éã§ããŸãã CLRãFCLã¿ã€ãã«æ圱ããWinRTã¿ã€ãã®å®å šãªãªã¹ãã¯ã ããã«ãããŸã ã
- ä»ã®ãã¹ãŠã®ã¿ã€ã ã WinRT APIã¿ã€ãã®å€§éšåã¯ããã®ãŸãŸ.NETéçºè ã«æäŸãããŸãã ããšãã°ã Windows.UI.Xaml.Controls.Buttonã¯ã©ã¹ã䜿çšããå ŽåãCLRã¯ãã®ã¿ã€ãã®ç¹å¥ãªãã¥ãŒãŸãã¯ããŒã·ã£ãªã³ã°ãæäŸããŸããã CLRãæ¡åŒµã¡ãœãããæäŸããã¿ã€ãããã®ã«ããŽãªã«å«ãŸããŸãã ããšãã°ã System.IO.Streamãã掟çããåãå¿ èŠãšãã.NET Frameworkã¯ã©ã¹ã§Windows.Storage.IInputStreamã®WinRTã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ãã䜿çšããã«ã¯ãSystemã¢ã»ã³ããªã®System.IO.WindowsRuntimeStreamExtensionsã¯ã©ã¹ã§å®çŸ©ãããŠããæ¡åŒµã¡ãœããã䜿çšããå¿ èŠããããŸãã Runtime.windowsruntime.dllã
èå³æ·±ãããšã«ãWindowsã¡ã¿ããŒã¿ãšã³ã³ãŒãã£ã³ã°ã®éèŠã§ã¯ãªãå Žæã«è¡šç€ºãããåã®å°ããªã«ããŽãªããŸã ãããŸãã ãããã¯ãWinRTåãèšè¿°ããããã«ã®ã¿äœ¿çšããã.NET Frameworkåã§ãã ããšãã°ãWindowsã©ã³ã¿ã€ã ããªã²ãŒãã¯åºæ¬åSystem.MulticastDelegateã§ãšã³ã³ãŒããããŸãããããã¯ãã¹ãŠã®Windowsã©ã³ã¿ã€ã ããªã²ãŒãããããŒãžã³ãŒããã掟çããããšãæå³ããŸããã 代ããã«ãåºæ¬åã¯ã¡ã¿ããŒã¿ããŒã¯ã³ãšããŠåã«äœ¿çšãããåãããªã²ãŒãåã§ããããšã瀺ããŸãã
ã¿ã€ãæ圱
CLRãWinRTã¿ã€ããæ圱ïŒè¡šç€ºïŒãããšãã2ã€ã®æäœãå®è¡ããŸãã
- CLRã¯ãWindowsã©ã³ã¿ã€ã ã¿ã€ãããããªãã¯ã§ã¯ãªããã©ã€ããŒããšããŠå®çŸ©ããŸãã ããã«ããããœãŒã¹ã¿ã€ãããããŒãžã³ãŒãããèŠããªããªããŸãã ã€ãŸã ãããŒãžã³ãŒãã«é¢ããŠã¯ãååšããå¯äžã®åã¯.NET Frameworkåã§ããããããã³ã°ã®ã¿ãŒã²ããã§ãã
- ãœãŒã¹ã¿ã€ããžã®ãã¹ãŠã®åç §ã¯ãã¿ãŒã²ãã.NET Frameworkã¿ã€ããžã®åç §ã«å€æãããŸãã
ãããã£ãŠãCLRã¯IVector <T>ã€ã³ã¿ãŒãã§ã€ã¹ãIList <T>ãšããŠè¡šããŸã ãIVector<T> CLRã®åå®çŸ©ã¯ããããªãã¯ã¹ã³ãŒãã§ã¯ãªããã©ã€ããŒãã¹ã³ãŒããæã€åå®çŸ©ãšèŠãªãããŸãã åæ§ã«ãIVector <UIElement>ãå®è£ ããWindows.UI.Xaml.Controls.UIElementCollectionã¿ã€ãã¯ãCLRã«ãã£ãŠæŽæ°ãããŸãã IVector <T>ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã¯IList <T>ã«ãªãã€ã¬ã¯ããããããããããŒãžã³ãŒãã®UIElementCollectionã¯IList <UIElement>ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸãã
éåžžã ildasm.exeã¯ããªãã€ã¬ã¯ããå«ããã«WinMDãã¡ã€ã«ã®çã®è¡šçŸã衚瀺ããŸãã ãªãã€ã¬ã¯ããæå¹ã«ããŠWinMDãã¡ã€ã«ã®å 容ã衚瀺ããã«ã¯ã/ projectãªãã·ã§ã³ãæå®ããå¿ èŠããããŸãã ãã®ãªãã·ã§ã³ã䜿çšãããšãCLRããã£ã¹ã¯äžã®ã¡ã¿ããŒã¿ã衚瀺ããæ¹æ³ã確èªã§ããŸãã
ããŒã¹ã¿ã€ã
WinRTã³ã³ããŒãã³ãã«ã¯å ±éã®åºæ¬ã¯ã©ã¹ã¯ãããŸãããããã¹ãŠã®Windowsã©ã³ã¿ã€ã ã¯ã©ã¹ã¯IInspectableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå¿ èŠããããããã¯IUnknownã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããŸãïŒããã¯é©ãã¹ãããšã§ã¯ãããŸããïŒã ãã ãã.NETéçºè ã«ãšã£ãŠããã¹ãŠã®WinRTåã¯System.Objectãã掟çããåã®ããã«èŠããããã EqualsãGetHashCodeãªã©ã®ã¡ãœãããç¶æ¿ããŸãã ããã¯ãCLRãå®è¡æã«ãªããžã§ã¯ããããŒã·ã£ãªã³ã°ããŠWinRTãã¥ãŒãš.NETãã¥ãŒéã§åãå€æããããã«å¯èœã«ãªããŸããã
æ§é
WinRTæ§é äœã¯ãéèŠãªCLRåãšã¯ç°ãªããåºæ¬åã®1ã€ã®ãªãŒãã³ãã£ãŒã«ãã®ã¿ãå«ãããšãã§ãããŸãã¯å¥ã®WinRTæ§é äœã«ããããšãã§ããŸãã ãããã£ãŠã次ã®ã³ãŒãã¯ã³ã³ãã€ã«æ®µéã§ãšã©ãŒãã¹ããŒããŸãã
public struct MyStruct { // 'MyStruct' contains non-public field 'MyStruct.i'. // Windows Runtime structures can contain only public fields. private Int32 i; //Windows Runtime structures can contain only fields. public MyStruct(Int32 i) { this.i = i; } //Windows Runtime structures can contain only fields. public void MyFunc() { } }
ããã«ãWinRTæ§é äœã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ãããããã«ããŒã¡ãœãããå«ããããšã¯ã§ããŸããã ãã ãã䟿å®äžãäžéšã®CLRæ§é ã¯ç¬èªã«æ圱ããããããéçºè ã«ãã«ããŒã¡ãœãããšã³ã³ã¹ãã©ã¯ã¿ãŒãæäŸãããŸãã ãããã«ã¯ãããšãã°ã Windows.Foundation.Point ã Windows.Foundation.Sizeãããã³Windows.Foundation.Rectã®æ§é ãå«ãŸããŸãã
è¡
WinRTã®System.Stringåã¯HSTRINGãšããŠè¡šãããŸã ã Windowsã©ã³ã¿ã€ã ã¡ãœãããåŒã³åºããšãCLRã¯ã¡ãœãããåŒã³åºãåã«.NET FrameworkæååãHSTRINGã«å€æããŸãã åæ§ã«ãCLRã¯ãã©ã³ã¿ã€ã ã¡ãœããããè¿ãããè¡ãSystem.Stringåã«å€æããŸã ã å¥ã®æ©èœããããŸã-WinRTåã·ã¹ãã ã§ã¯ãæååãnullã«ããããšã¯ã§ããŸããã nullã®ä»£ããã«ã String.Emptyã䜿çšããŠç©ºã®æååãæž¡ãå¿ èŠããããŸãã nullãæååãšããŠWinRTé¢æ°ã«æž¡ãããšãããšãCLRã¯ArgumentNullExceptionãã¹ããŒããŸãã åæ§ã«ãWinRTé¢æ°ãnullæååãè¿ãããšã¯æ±ºããŠãããŸããã空æååã®ã¿ã§ãã
ãã«äºæã¿ã€ã
WinRT APIã¯ã Windows.Foundation.IReference <T>ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠnulläºæã®éèŠãªåãå®çŸ©ããŸããããã¯ãCLRãç¬èªã®System.Nullable <T>ã«æ圱ããŸãã ããšãã°ãWinMDãã¡ã€ã«ã®ã¡ãœããã«æ¬¡ã®ã·ã°ããã£ãããå ŽåïŒ
IReference<bool> Method(IReference<int> i);
ãããŒãžã³ãŒãã§ã¯ããã®ã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
Nullable<bool> Method(Nullable<int> i);
代衚è
WinRTããã©ã¡ãŒã¿ãŒã¿ã€ããŸãã¯ããªã²ãŒãã®æ»ãå€ãšããŠäœ¿çšã§ããã®ã¯ãWinRTäºæã¿ã€ãã®ã¿ã§ãã ãŸããã°ããŒãã«ïŒãããªãã¯ïŒã¹ã³ãŒããæã€ããªã²ãŒãããã¹ããšããŠå®£èšããããšã¯ã§ããŸããïŒå®éããããã¯Windowsã©ã³ã¿ã€ã å šäœã®äžè¬çãªèŠåã§ãïŒã ããªã²ãŒããªããžã§ã¯ããWindowsã©ã³ã¿ã€ã ã³ã³ããŒãã³ãã«æž¡ããšããã®ãªããžã§ã¯ãã¯CCWã©ãããŒã«ã©ãããããŸããCCWã©ãããŒã¯ã䜿çšããã³ã³ããŒãã³ãã«ãã£ãŠè§£æŸããããŸã§ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠç Žæ£ãããŸããã ãã1ã€ã®èå³æ·±ãäºå®ã¯ãWinRTããªã²ãŒãã«BeginInvokeã¡ãœãããšEndInvokeã¡ãœããããªãããšã§ãã
ã€ãã³ã
WinRTã³ã³ããŒãã³ãã¯ãWinRTããªã²ãŒãã¿ã€ãã®ã¿ã䜿çšããŠã€ãã³ããå®çŸ©ã§ããŸãã CLRã.NET Framework System.EventHandler <TEventArgs>ããªã²ãŒãåã«ãããããWindows.Foundation.EventHandler <T>ããªã²ãŒãåããããŸãã ã€ãã³ãã¡ã³ããŒãå®çŸ©ããå ŽåïŒ
public event EventHandler<RoutedEventArgs> MyEvent;
次ã«ããã®ã³ãŒãè¡ãã³ã³ãã€ã«ãããšãã«ãã³ã³ãã€ã©ãŒã¯æ¬¡ã®åœä»€ã«å€æããŸãã
private EventRegistrationTokenTable<EventHandler<RoutedEventArgs>> MyEvent; public EventRegistrationToken add_MyEvent(EventHandler<RoutedEventArgs> handler) { return EventRegistrationTokenTable<EventHandler<RoutedEventArgs>> .GetOrCreateEventRegistrationTokenTable(ref MyEvent) .AddEventHandler(handler); } public void remove_MyEvent(EventRegistrationToken token) { EventRegistrationTokenTable<EventHandler<RoutedEventArgs>> .GetOrCreateEventRegistrationTokenTable(ref MyEvent) .RemoveEventHandler(token); }
åãšåæ§ã«ãã³ã³ãã€ã©ã¯ããã©ã€ããŒããã£ãŒã«ããšãã€ãã³ãã®ç»é²ãšãµãã¹ã¯ã©ã€ã解é€ã®ããã®2ã€ã®ã¢ã¯ã»ãµã¡ãœãããäœæããŸãã ãã ãããããã®ã¡ãœããã®ãã£ãŒã«ããšã³ã³ãã³ãã®ã¿ã€ãã¯ããããŸã§äœ¿çšããŠãããã®ïŒ Delegate.Combineããã³Delegate.Remove ïŒãšã¯ç°ãªããŸãã äžè¬åãããã¯ã©ã¹EventRegistrationTokenTable <T>ã¯ãã£ãŒã«ãã¿ã€ããšããŠäœ¿çšããããã®ã¿ã€ãåŒæ°ã¯å¯Ÿå¿ããããªã²ãŒãã¿ã€ãã§ãã ãã®ã¯ã©ã¹ã¯ãã€ãã³ããã³ãã©ãŒãè¡šãããªã²ãŒãã®ãã§ãŒã³ãæ ŒçŽããŸãã æ°ãããã³ãã©ãŒãè¿œå ãããšã EventRegistrationTokenããŒã¯ã³ãè¿ãããŸã ããã㯠ãåŸã§ã€ãã³ããã³ãã©ãŒãåé€ããããã«äœ¿çšã§ããŸãã
public void RaiseEvent() { var list = EventRegistrationTokenTable<EventHandler<RoutedEventArgs>> .GetOrCreateEventRegistrationTokenTable(ref MyEvent) .InvocationList; if (list != null) list(this, new RoutedEventArgs()); } public void Main() { var myClass = new MyClass(); var token = myClass.add_MyEvent(Handler); myClass.RaiseEvent(); myClass.remove_MyEvent(token); myClass.RaiseEvent(); } private void Handler(object sender, RoutedEventArgs args) { Debug.WriteLine("event handling"); }
ã€ãã³ããçºçãããã«ã¯ã InvocationListããããã£ã䜿çšããŸãããã®ããããã£ã¯ãã€ãã³ããã³ãã©ãŒãšããŠè¿œå ããããã¹ãŠã®ããªã²ãŒããåŒã³åºããªã¹ãã«å«ãããªã²ãŒããè¿ããŸãã
æ¥æ
WinRTã§ã¯ãæå»ãšæ¥ä»ã¯Windows.Foundation.DateTimeæ§é äœã«ãã£ãŠUTCã§è¡šãããŸãã CLRã¯ããã®åãSystem.DateTimeã§ã¯ãªãSystem.DateTimeOffsetæ§é äœã«ãããããŸãã DateTimeã«ã¯ã¿ã€ã ãŸãŒã³æ å ±ãå«ãŸããŠããªãããšã«æ³šæããŠãã ããã ãããã£ãŠãWinRTé¢æ°ã«ãã£ãŠUTC圢åŒã§è¿ãããæ¥ä»ãšæå»ã¯ãCLRã«ãã£ãŠããŒã«ã«æå»ã«å€æãããŸãã éã«ã DateTimeOffsetæ§é äœãWinRTé¢æ°ã«æž¡ããšãæ¥ä»ãšæå»ã¯UTC圢åŒã«å€æãããŸãã
é å
WinRT APIã¯1次å é åã®ã¿ããµããŒãããŸãã ãããã£ãŠã次ã®ã³ãŒãã§ã¯ã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
// Arrays in Windows Runtime method signatures must be one dimensional. public int[,] MyFunc() { return new int[5, 5]; }
ãããŒãžã³ãŒãã§ã¯ãé åã¯åç §ã«ãã£ãŠæž¡ãããé åã®èŠçŽ ãžã®å€æŽã¯ããã®é åã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ãæã€ãã¹ãŠã®ã³ãŒãã«è¡šç€ºãããŸãã ãã ããWinRTã®å Žåãé åã®å 容ã¯ãAPIãSystem.Runtime.InteropServices.InAttributeããã³System.Runtime.InteropServices.OutAttributeã䜿çšããŠãã®çœ²åã§å®çŸ©ããæ¹åã«ã®ã¿ããŒã·ã£ãªã³ã°ããããããåžžã«ãããšã¯éããŸããã ã©ã¡ãã®å±æ§ãã¡ãœããã®ãã©ã¡ãŒã¿ãŒãŸãã¯æ»ãå€ã«é©çšãããå®è¡æã«ç®¡ç察象ã¡ã¢ãªãšç®¡ç察象å€ã¡ã¢ãªã®éã§ããŒã·ã£ãªã³ã°ã®æ¹åã決å®ããŸãã Windowsã©ã³ã¿ã€ã ã§ã¯ããã©ã¡ãŒã¿ãŒã¯èªã¿åãå°çš[InAttribute]ãŸãã¯æžã蟌ã¿å°çš[OutAttribute]ã®ããããã§ããã[InAttribute]ã[OutAttribute]ã®èªã¿åããšæžã蟌ã¿ãåæã«ããŒã¯ããããšã¯ã§ããŸããã ã€ãŸããã¡ãœããã«æž¡ãããé åã®å 容ãšé åèªäœã¯ãèªã¿åããŸãã¯æžã蟌ã¿ãè¡ãå¿ èŠããããŸãã ãããã£ãŠã[InAttribute]å±æ§ã§ããŒã¯ãããé åã®å 容ã¯ãåŒã³åºãããã¡ãœããã«ã³ããŒããããããã¡ãœãããé åã«é©çšãããã¹ãŠã®å€æŽã¯ãåŒã³åºãå ã®ãªããžã§ã¯ãã«ã¯è¡šç€ºãããŸããã åæ§ã«ã[OutAttribute]å±æ§ã§ããŒã¯ãããé åã®å 容ã¯ãåŒã³åºãããã¡ãœããã«ãã£ãŠèšå®ãããåŒã³åºãå ã®ãªããžã§ã¯ãã«ã³ããŒããããããåŒã³åºãããã¡ãœããã¯å ã®é åã®å 容ã«ã€ããŠä»®å®ããŸããã
ã³ã¬ã¯ã·ã§ã³
ã³ã¬ã¯ã·ã§ã³ã転éãããšããCLRã¯ã³ã¬ã¯ã·ã§ã³ãªããžã§ã¯ããCCWã©ãããŒã«ããã¯ããWinRT APIã§ã³ã¬ã¯ã·ã§ã³ã«ãªã³ã¯ãæž¡ããŸãã åæã«ãã©ãããŒãä»ããåŒã³åºãã¯çžäºäœçšã®å¢çãè¶ããçç£æ§ã«æªåœ±é¿ãåãŒããŸãã ãã ããé åãšã¯ç°ãªããèŠçŽ ãã³ããŒããã«æäœãå®è¡ã§ããŸãã
ãããã«
èŠçŽãããšãCLRã®å€æŽã«ããããããŒãžã³ãŒãéçºè ã¯äœ¿ãæ £ãããã¯ãããžã䜿çšããŠãæ°ããWindowsã©ã³ã¿ã€ã APIã«ç°¡åã«é©å¿ã§ããããšã«æ³šæããŠãã ããã ãã®èšäºã§ã¯ãWinRTãšCLRã®çžäºäœçšã®è©³çŽ°ããã¯ã»ã©é ãããšã説æããŸããã ãã ããããã¯ãWindowsã©ã³ã¿ã€ã ã®ãããªã調æ»ãšããæ·±ãç解ã®åºç€ãæäŸã§ããŸãã