ããããŒã°
æè¿ãããã¹ãããã³ãã¬ãŒãã«åºã¥ããŠäœæããã¬ã¿ãŒã®å€§éã¡ãŒã«éä¿¡ã®åé¡ãçºçããŸããããã³ãã¬ãŒãã«ã¯ãéçã³ã³ãã³ãã«å ããŠãåä¿¡è
ãšããã¹ãã®æçã«é¢ããæ
å ±ããããŸãã ç§ã®å Žåãããã¯è³Œèªè
ã«æ°ããèšäºã®å
¬éã«ã€ããŠèªåçã«éç¥ããããã®ãã³ãã¬ãŒãã§ã;ãããã£ãŠãåä¿¡è
ã«ã¢ããŒã«ããå
¬éãžã®çŸãããã¶ã€ã³ããããªã³ã¯ãæã£ãŠããŸãã
ããã«è³ªåãçºçããŸãã-ãããå®è£
ããæ¹æ³ã¯ïŒ ãã³ãã¬ãŒãã«äžå®ã®å€ãèšå®ããããšããå§ãŸããäžããããã¢ãã«ããŒã¿ã§çœ®ãæããããæ¬æ ŒçãªRazorãã¥ãŒã§çµããïŒãµã€ãã¯MVC 5äžã«æ§ç¯ãããŸãïŒããŸããŸãªãœãªã¥ãŒã·ã§ã³ãæãæµ®ãã³ãŸããã
ç§ãšã®çãæŠãã®åŸãç§ã¯ãã®ããªãäžè¬çãªã¿ã¹ã¯ãå®å
šã«è§£æ±ºããæã§ããããã®è§£æ±ºçã¯ããã»ã©è€éã§ãã£ãŠã¯ãªããªããšããçµè«ã«éããŸããïŒã€ãŸãã.NET Frameworkã®äžéšã§ã¯ãªãã©ã€ãã©ãªã«äŸåãã¹ãã§ã¯ãããŸããïŒ 4ïŒããããåæã«ã¿ã¹ã¯ã解決ããã®ã«ååæ©èœçã§ãããæ¡åŒµæ§ã®ããŒãžã³ããããŸãã
ãã®èšäºã§ã¯ããããã®èŠä»¶ãæºãããã€ãã³ãŒããžã§ãã¬ãŒã¿ãŒã«åºã¥ãããœãªã¥ãŒã·ã§ã³ãšãæãèå³æ·±ãã³ãŒãã«ã€ããŠã³ã¡ã³ãããŸãã
ãã³ãã¬ãŒããšã³ãžã³ã®ã¿ã«èå³ãããå Žåã¯ã以äžã®ãªã³ã¯ãã芧ãã ããã
SourceForgeã®ãããžã§ã¯ãã®ãã³ãã¬ãŒããšã³ãžã³ïŒGenesis.PatternizerïŒããã³ãã¹ãã³ã³ãœãŒã«ã®ãœãŒã¹ã³ãŒãïŒ
https ://sourceforge.net/projects/open-genesis/?source=navbar
ãŸãã¯ã1ã€ã®ãã¡ã€ã«ã®ã¢ãŒã«ã€ãïŒ
Patternizer.zipåé¡ã®å£°æ
ãŸããæ§æã決å®ããŸãããã å人çã«ã¯ãåçŽãªå€ããã©ãŒãããããããã«åºã䜿çšãããŠããstring.Formaté¢æ°ã奜ãã§ãã ãã®æ§æã䜿çšããŠãå€ããã³ãã¬ãŒãã«æ¿å
¥ãããå Žæã瀺ããŸãã
'{' <> [ ':' < > ] [ '|' < > ] '}'
äŸïŒ{User.GetFIOïŒïŒ}ã{User.Name | user}ã{User.BirthdateïŒdd.MM.yyyy}ã{User.ScoreïŒ0.00 |äœããããŸãã}ã
ç®çã®å€ãnullãŸãã¯ãŸã£ãããªãå Žåãããã©ã«ãå€ã眮ãæããããŸãã æå®ãããããããã£/ãã£ãŒã«ã/ã¡ãœãããã¢ãã«ã§èŠã€ãããªãå Žåã äºéäžæ¬åŒ§ã䜿çšããŠïŒstring.Formaté¢æ°ã®ããã«ïŒäžæ¬åŒ§ããšã¹ã±ãŒããããã©ãŒãããæååã®æåããšã¹ã±ãŒãããŸããããã©ã«ãå€ã¯ã¹ã©ãã·ã¥ã§ãã
ãŸãããã¹ãäŸã§äœ¿çšãããæ¢è£œã®ãã³ãã¬ãŒãã®äŸã次ã«ç€ºããŸãã
, {User.GetFIO()|}! , : function PrintMyName() {{ Console.WriteLine("My name is {{0}}. I'm {{1}}.", "{UserName|}", {User.Age:0}); }} {Now:dd MMMM yyyy} {Now:HH:mm:ss}
æåã¯ããã³ãã¬ãŒãã¯ã¢ãã«ã®ãããªãã¯ããããã£ã®ã¿ããµããŒããããšæ³å®ããŠããŸããããéçºããã»ã¹äžã«ããã£ãŒã«ããšã¡ãœããïŒæååãæ°å€ãããŒã«åãnullãªã©ã®åŒæ°ãæž¡ãå¯èœæ§ãããïŒããã³ä»»æã®æ¬¡å
ã®é
åãžã®ã¢ã¯ã»ã¹ã®ãµããŒããè¿œå ãããŸããã ã€ãŸã 次ã®åŒãæå¹ãªãã¿ãŒã³ã«ãªããŸãã
: {User.Account[0].GetSomeArrayMethod("a", true, 8.5, null)[5,8].Length:0000|NULL}
解決ç
ããŒãµãŒ
æåã«ãããã¹ããã³ãã¬ãŒããã©ãããããç解ããå¿
èŠããããŸãã ãã¡ãããã¢ãã«çœ®æã®åŒã³åºãããšã«ãã³ãã¬ãŒãããŒã¿ãåæããå€ãæ€çŽ¢ããŠçœ®æããããšãã§ããŸãã ããããããã¯éåžžã«é
ãæ¹æ³ã§ãã ãã³ãã¬ãŒããäžåºŠåå¥ã®è«çãã©ã°ã¡ã³ãïŒãã³ãã¬ãŒãèŠçŽ ïŒã«è§£æããŠãããå°æ¥ãããã®èŠçŽ ãæäœããæ¹ãã¯ããã«å¹ççã§ãã 3ã€ã®æãããªèŠçŽ ã¿ã€ãããããŸãïŒ
æååå®æ° ïŒçµæã«çŽæ¥å€åããªããã³ãã¬ãŒãã®éšåïŒã
眮æ ïŒäžæ¬åŒ§å
ïŒã
ã³ã¡ã³ã ïŒãã®èŠçŽ ã¯å®è£
ãããŠããŸãããããããäœã§ããããç解ããŠãããšæããŸãïŒ ïŒ
ãããã®èæ
®äºé
ã«åºã¥ããŠããã³ãã¬ãŒãèŠçŽ ã®åºæ¬ã¯ã©ã¹ã説æããŸãã
EstimatedLengthããããã£ãšGetNullValueïŒïŒã¡ãœããã®æå³ã以äžã«èª¬æããŸãã
次ã«ãç¹å®ã®å®è£
-æååå®æ°ãšçœ®æïŒãåŒããšåŒã³ãŸãïŒã«ã€ããŠèª¬æããŸãã
public class StringConstantElement : PatternElement { public string Value { get; set; } public override int EstimatedLength { get { return Value == null ? 0 : Value.Length; } } public override string GetNullValue() { return Value; } } public class ExpressionElement : PatternElement { public string Path { get; set; } public string FormatString { get; set; } public string DefaultValue { get; set; } public override int EstimatedLength { get { return Math.Max(20, DefaultValue == null ? 0 : DefaultValue.Length); } } public override string GetNullValue() { return DefaultValue; } }
ãŸããå
¥åæã«ããã¹ããã³ãã¬ãŒããåãå
¥ããäžé£ã®èŠçŽ ãçºè¡ãã
IPatternParserããŒãµãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠã説æããŸãã
public interface IPatternParser { IEnumerable<PatternElement> Parse(string pattern); }
äžæ¬åŒ§
BracePatternParserã«åºã¥ããŠããŒãµãŒãåŒã³åºããŸãã ããŒãµãŒã®äœæçµéšãããŸããªãããïŒããŒãµãŒãæ¬è³ªçã«è¡ã£ãŠããããšã§ãïŒããã®å®è£
ã«ã¯æ·±ãå
¥ããŸããã
BracePatternParser.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Genesis.Patternizer {
ãã«ããŒãžã§ãã¬ãŒã¿ãŒ
äžèšã®ããŒãµãŒã¯ãäžè¬çãªã¿ã¹ã¯ã®äžéšã®ã¿ãå®è¡ããŸãã ãã³ãã¬ãŒãèŠçŽ ã®ã»ãããååŸããã ãã§ã¯äžååã§ãããããããåŠçããå¿
èŠããããŸãã ãããè¡ãããã«ãã·ã¹ãã ã®äž»èŠã³ã³ããŒãã³ãã§ãã
IBuilderGeneratorãè¡šãå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèª¬æããŸãã
public interface IBuilderGenerator { Func<object, string> GenerateBuilder(List<PatternElement> pattern, Type modelType); }
æé«ã®ããã©ãŒãã³ã¹ãéæããããã«ãæ°ããã¿ã€ãã®ã¢ãã«ïŒ
modelType ïŒããšã«æ°ãããã«ããŒãäœæãããããããã·ã¥ã«æžã蟌ã¿ãŸãã ãã«ããŒèªäœã¯ãå
¥åã§ãªããžã§ã¯ãïŒã¢ãã«ïŒãååŸããæååïŒå®æãããã³ãã¬ãŒãïŒãè¿ãéåžžã®é¢æ°ã§ãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å
·äœçãªå®è£
ã以äžã«ç€ºãããã®åã«ããã¹ãŠããªã³ã¯ããã·ã¹ãã ã®æåŸã®ã³ã³ããŒãã³ããæ€èšããŸãã
ãã³ãã¬ãŒããšã³ãžã³
ãã³ãã¬ãŒããšã³ãžã³èªäœã¯ããã³ãã¬ãŒããããŒãµãŒãããã³ãã«ããŒãæ¥ç¶ããã¯ã©ã¹ã§ãã ãŸãããã®ã³ãŒãã¯ãéåžžã«èå³æ·±ããã®ã§ã¯ãããŸããã
Patternizator.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using BUILDER = System.Func<object, string>; namespace Genesis.Patternizer {
PatternizatorOptions.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Genesis.Patternizer {
ãªãã·ã§ã³ïŒ
PatternizatorOptions ïŒã¯ãããšãã°æšæºã®æ§æãšã¯ç°ãªããã³ãã¬ãŒãæ§æã䜿çšããå Žåã«ãããŒãµãŒãŸãã¯ãã«ããŒãžã§ãã¬ãŒã¿ãŒã®ç¹å®ã®å®è£
ã䜿çšããããã«ãã³ãã¬ãŒããšã³ãžã³ã«æ瀺ã§ãããªãã·ã§ã³ã®åŒæ°ã§ãã
æšæºãšããŠãã³ãã¬ãŒããšã³ãžã³ã䜿çšããäŸïŒ
ãã®äŸã§ã¯ãã¢ãã«ã¯å¿ååã§ãããããã§æ··ä¹±ããããšã¯ãããŸããã ã«ãŒãã§ãã®ã¿ã€ãã®èŠçŽ ãçæããå Žåã§ãããã«ããŒã¯ãGenerateã¡ãœãããæåã«åŒã³åºããããšãã«äžåºŠã ãäœæãããŸãã ããããèšäºã®æåŸã§ããã©ãŒãã³ã¹ã®åé¡ã«æ»ããŸãã次ã«ããã®åºçç©ã®æãèå³æ·±ããããã°çªãèŠãŠã¿ãŸãããã
ãã€ãã³ãŒããã«ããŒãžã§ãã¬ãŒã¿ãŒ
ãŸããå°ããªåæãè¡ããŸãã çè«äžããã®åé¡ã¯ã©ã®ããã«è§£æ±ºã§ããŸããïŒ
ãã³ãã¬ãŒãèŠçŽ ïŒå®æ°ãšåŒïŒãšã¢ãã«ã®ã¿ã€ãã®ãªã¹ããããããšãæãåºãããŠãã ããã ãŸããé¢æ°
Func <objectãstring>ãååŸããå¿
èŠããããŸãããã®é¢æ°ã¯ããã³ãã¬ãŒãã§æå®ãããã¿ã€ãã®ã¢ãã«ã眮ãæããåºåã§æååãåãåããŸãã
å®æ°ã«é¢ãã質åããªãå ŽåïŒStringBuilderã§æããã ãã§ãïŒãåŒã§ã¯ãã¹ãŠãããè€éã«ãªããŸãã
ã¢ãã«ããåŒã®å€ãååŸããæ¹æ³ã«ã¯ã3ã€ã®å¯èœãªãªãã·ã§ã³ããããŸãã
- åå°ãéããŠ
- CïŒã³ãŒããçæããã³ã³ãã€ã«ããŠã¢ã»ã³ããªã«æ¥ç¶ããŸã
- ãã€ãã³ãŒãã®æ¬æã䜿çšããŠåçé¢æ°ïŒ System.Reflection.Emit.DynamicMethod ïŒãèšè¿°ããŸã
æåã®ãªãã·ã§ã³ã¯æããã«é
ãã§ãããªããªã åå°ã¯åžžã«ãã£ãããšåããŸãã ããªããžã®ç§ã®ã¢ããã€ã¹ã¯ãé »ç¹ã«å®è¡ãããæäœã«ãªãã¬ã¯ã·ã§ã³ã䜿çšããªãããšã§ãã ãã®äœ¿çšã«æé©ãªãªãã·ã§ã³ã¯ãããã°ã©ã ã®èµ·å段éã§ã®æºåã§ãã ãã¯ã©ã¹ãé§ãæããå±æ§ã«å¿
èŠãªæ
å ±ãèŠã€ããããçš®ã®æ¥ç¶ïŒããªã²ãŒããã€ãã³ãïŒãæ§ç¯ããŠãããåã³ãªãã¬ã¯ã·ã§ã³ã«é Œããã«ãããã䜿çšããããªã©ã§ãã äžè¬çã«ãåå°ã¯æããã«ãã®ã¿ã¹ã¯ã«ã¯é©ããŠããŸããã
2çªç®ã®ãªãã·ã§ã³ã¯éåžžã«åªããŠãããæåã¯äœ¿çšãããã£ãã§ãã ãã«ããŒé¢æ°ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãïŒæåã®ãã³ãã¬ãŒãã®å ŽåïŒïŒ
public string Generate(object input) { if (input == null) {
ãã¡ãããã³ãŒãã¯ååã«é·ããªããŸããã誰ãèŠãã®ã§ããããïŒ äžè¬ã«ããã®ãªãã·ã§ã³ã¯ãå¿ååã§ãªãå Žåã«æé©ã§ãã äžèšã®ã³ãŒãã§ã¯ãã¢ãã«å€æ°
Model model = inputã<ïŒ>ãšããŠå®£èšã§ããŸããã§ãã
ã ã¢ãã«ã¿ã€ãã«ååããªãã£ãå Žåã
ãããã£ãŠã3çªç®ã®ãªãã·ã§ã³ã¯æ®ããŸãã åãã³ãŒãããã€ãã³ãŒãã§çŽæ¥çæããŸãã ãã³ãã¬ãŒããšã³ãžã³ãäœæãããšããç§èªèº«ãåããŠåçé¢æ°ãšãã€ãã³ãŒããžã§ãã¬ãŒã¿ãŒã䜿çšããŸããããããããã®æè¡ãç¿åŸããéã«ã芪æãªãèªè
ã®æ¹ãåé¡ãå°ãªããªãããã«ãã®èšäºãæžããã£ããã«ãªããŸããã
åçã¢ã»ã³ããªãåçé¢æ°ãããã³ãã€ãã³ãŒããžã§ãã¬ãŒã¿ãŒã¯System.Reflection.Emitåå空éã«èšè¿°ãããŠããããããã䜿çšããããã«è¿œå ã®ã©ã€ãã©ãªãæ¥ç¶ããå¿
èŠã¯ãããŸããã
æãåçŽãªåçé¢æ°ã¯æ¬¡ã®ããã«äœæãããŸãã
cs.EmitïŒOpCodes.RetïŒ; -ããã¯ãã³ãã³ãããã€ãã³ãŒãã§æžã蟌ãæäœã§ãã ç¥ããªã人ã¯èª°ã§ãã
ãã€ãã³ãŒãã¯.NETèšèªã®ã¢ã»ã³ãã©ãŒã®ãããªãã®ã§ãã
匷ããéããŠãã®æ®µèœã®åã®èšäºãèªãã å Žåã質åããããŸããã³ãã³ããããããªãå Žåã¯ã©ãããã°ãã€ãã³ãŒããçæã§ããŸããïŒ çãã¯éåžžã«ç°¡åã§ãã ãããè¡ãã«ã¯ãè¿œå ã®ããã°ã©ã ãå¿
èŠã§ãïŒãããžã§ã¯ãã¯ã¢ãŒã«ã€ãå
ã«ãããŸãïŒããã®ã³ãŒãã¯ãã¿ãã¬ã®äžã§æäŸãããŸãã
ILDasm using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; namespace ILDasm { class Program { #region Static static void Main(string[] args) { new Program().Run(); } #endregion public void Run() { string basePath = AppDomain.CurrentDomain.BaseDirectory; string exeName = Path.Combine(basePath, AppDomain.CurrentDomain.FriendlyName.Replace(".vshost", "")); Process.Start(@"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\ildasm.exe", string.Format(@"/item:ILDasm.TestClass::DoIt ""{0}"" /text /output:code.il", exeName)); } } public class TestClass { public string DoIt(object value) { StringBuilder sb = new StringBuilder(); return sb.ToString(); } } }
ããã°ã©ã ã®æå³ã¯ãã¹ã¿ãžãªã«çµã¿èŸŒãŸãã
ildasmé
ã¢ã»ã³ãã©ãŒãå®è¡ãã
TestClassã¯ã©ã¹ã®
DoIté¢æ°ã«å¯ŸããŠèšå®ããããšã§ãã ãã®é¢æ°ã®æ¬äœã®ãã€ãã³ãŒãã¯code.ilãã¡ã€ã«ã«é
眮ãããéããŠåæã§ããŸãã DoIté¢æ°ã®ãã€ãã³ãŒããæã¡èŸŒã¿ãŸãïŒè¿œå åé€ïŒïŒ
IL_0000: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor() IL_0005: stloc.0 IL_0006: ldloc.0 IL_0007: callvirt instance string [mscorlib]System.Object::ToString() IL_000c: ret
è©Šè¡é¯èª€ã®æ¹æ³ãšçµã¿åããããé è骚ããã¯ã¹å
ã®ç©è³ªã¯ãé¡æšã«ãã£ãŠã³ãŒããçæããã®ã«åœ¹ç«ã¡ãŸãã çæãããé¢æ°ã«å¿
èŠãªãã®ã®ããã«DoIté¢æ°ã®æ¬äœãèšè¿°ãããŠãŒãã£ãªãã£ãå®è¡ããã³ãŒããèŠãŠãžã§ãã¬ãŒã¿ãŒã«å®è£
ããŸãã
ãã€ãã³ãŒãã®äžè¬æ
å ±
ãã¹ãŠãã¹ã¿ãã¯äžã«æ§ç¯ãããŸãã
å ç®æŒç®
aãš
bãå®è¡ããå Žåãå€æ°
aã®å€ãã¹ã¿ãã¯ã«ããã·ã¥ããå€æ°
bã®å€ãã¹ã¿ãã¯ã«ããã·ã¥ããŠãããaddã³ãã³ããåŒã³åºãå¿
èŠããããŸãã ãã®å Žåãã¹ã¿ãã¯ã®
aãš
bãã¯ãªã¢ãããå ç®ã®çµæãæäžéšã«é
眮ãããŸãã ãã®åŸãåèšã«
cãä¹ç®ãããã®å€ãã¹ã¿ãã¯ã«çœ®ãïŒçŸåšããã§ã«åèš
a + bãããããšã«æ³šæããŠãã ããïŒãä¹ç®æŒç®ïŒmulïŒãåŒã³åºããŸãã
çµæã®ãã€ãã³ãŒãïŒ
IL_0000: ldarg.1 IL_0001: ldarg.2 IL_0002: add IL_0003: ldarg.3 IL_0004: mul
ãããŠãCïŒã§ã®è¡šç€ºã¯æ¬¡ã®ãšããã§ãã
cs.Emit(OpCodes.Ldarg_1); cs.Emit(OpCodes.Ldarg_2); cs.Emit(OpCodes.Add); cs.Emit(OpCodes.Ldarg_3); cs.Emit(OpCodes.Mul);
ã¡ãœãããšã³ã³ã¹ãã©ã¯ã¿ãŒã¯åãæ¹æ³ã§åŒã³åºãããŸãïŒåŒæ°ãã¹ã¿ãã¯ã«çœ®ããã¡ãœãã/ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãïŒã ãã®å Žåãééçã¡ãœããã®å Žåãæåã«ã¹ã¿ãã¯ã«é
眮ããã®ã¯ãã¡ãœãããåŒã³åºããŠããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã
ãã®èšäºã¯ããã€ãã³ãŒãçæã®å®å
šãªãã¬ãŒãã³ã°ãæäŸããããšãç®çãšããŠããªãããããžã§ãã¬ãŒã¿ãŒã®èª¬æãç¶ããŸãããã
ãžã§ãã¬ãŒã¿ãŒã³ã¢ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããé¢æ°ïŒ
IBuilderGenerator ïŒã§å²ãŸããŠããŸãã
ãããããã³ãã¬ãŒãèŠçŽ ã®GetNullValueïŒïŒã¡ãœãããšEstimatedLengthããããã£ã䟿å©ãªå Žæã§ãã
ãžã§ãã¬ãŒã¿ãŒã®ç¹åŸŽã¯ããã®æ¡åŒµæ§ã§ãã åé ã§èª¬æãããã³ãã¬ãŒãèŠçŽ ã®ã¿ã€ãïŒæååå®æ°ãšåŒïŒã«ã¯é¢ä¿ãããŸããã å¿
èŠã«å¿ããŠãç¬èªã®èŠçŽ ãèãåºãããã®ãžã§ãã¬ãŒã¿ãŒãç¶æ¿ããŠãäœæããèŠçŽ ã®ã¿ã€ãã®ãã€ãã³ãŒããçæããæ©èœãè¿œå ã§ããŸãã ãããè¡ãã«ã¯ãã³ãŒãã§
PatternElementAttributeå±æ§ã䜿çšããŠé¢æ°ãèšè¿°ããå¿
èŠããããŸããããšãã°ãæšæºãžã§ãã¬ãŒã¿ãŒã®å®è£
ã«å«ãŸããæååå®æ°ã®ã³ãŒãçæã¯æ¬¡ã®ããã«èšè¿°ãããŸãã
[PatternElement(typeof(StringConstantElement))] protected virtual void GenerateStringConstantIL(ReflectionBuilderGeneratorContext context, StringConstantElement element) { if (element.Value != null) { WriteSB_Constant(context, element.Value); } }
ä»ã®ã¡ãœããã®ã³ãŒãã¯æäŸããŸãã ãšãŠãé¢åã§ããã質åãããã°ãåå¥ã«çããããšããŸãã
æ§èœè©Šéš
ãªããªã
ãã³ãã¬ãŒããšã³ãžã³ãä»ã®ãã³ãã¬ãŒããšã³ãžã³ãšæ¯èŒããæ©äŒã¯ãããŸãããstring.ReplaceïŒïŒã«åºã¥ãããŒãã³ãŒããã³ãã¬ãŒããžã§ãã¬ãŒã¿ãŒãšæ¯èŒããŸããã¹ã¯ãªãŒã³ã·ã§ããïŒ

çµè«ã®ä»£ããã«
ãã®èšäºã¯å€§ãããå€ããããããããªãããšãããã£ãããããã§åãäžãããããããã¯ã¯ããã»ã©åçŽã§ã¯ãªãããããã£ãŠããã€ãã³ãŒãçæã®ã©ã®è³ªåããã詳现ã«ç¥ãããã®ãã賌èªãåæ¢ãããããé¡ãããŸãããããã®åé¡ã«ã€ããŠã¯ãå¥ã®èšäºãæžãããã«ããŸããç§ã®ä»ã®åºçç©
- é¢æ°ã€ã³ã¿ãŒããªã¿ãŒã䜿çšãã.NETäžã®ãããžã§ã¯ãã®ããŒã«ã©ã€ãº