PDA

View Full Version : چگونه می توانم یک دستور(در قالب یک رشته) را در #C اجرا کنم؟



bsng110
دوشنبه 18 شهریور 1387, 16:42 عصر
هوالحکیم
سلام عرض می کنم خدمت دوستان و اساتید محترم سایت
ببخشید که این سوال را مطرح می کنم ولی من خیلی جستجو کردم و چیزی در این مورد که می خواهم بیان کنم، در سایت پیدا نکردم. من نیاز دارم که یک یا چند دستور #C را که به صورت text دارم(با فرض اینکه از صحت کامپایل آنها مطمئن هستم) اجرا کنم. دقت کنید که می خواهم این عمل در زمان اجرا صورت گیرد، مثلاً فرض کنید قطعه کدی در زمان اجرا از طریق پایگاه داده یا حتی یک textbox ساده، گرفته می شود و می خواهیم این قطعه کد اجرا شود. برای این منظور باید از چه کلاسی استفاده کنم(کلاس را هم که بگویید، ان شاء الله می توانم بقیه اش را پیدا کنم اما اگه کد آماده هم داشته باشید که دیگه خیلی شرمنده تون می شم). در ضمن باید بگویم که دیده ام با استفاده از کلاس های System.Reflection از اسمبلی یک کلاس یا ... می سازند و یا اینکه از طریق System.Runtime چیز هایی مثل اجرای متد از dll انجام می دهند و ... ولی نمونه چیزی که می خواهم را ندیده ام. همچنین سوال دیگری که داشتم در مورد محاسبه گر بود، مثلاً فرض کنید یک عبارت ریاضی به صورت 2*3+5-6 داریم و می خواهیم نتیجه آن را بدانیم(این عبارت به صورت text می باشد). آیا در NET. کلاس هایی(یا متدهایی) برای این منظور در نظر گرفته شده است یا خیر؟
اگر دوستان در این زمینه ها اطلاعاتی دارند، ممنون می شوم در اختیار بنده نیز قرار دهند. دقت کنید که خودم قصد پیاده سازی این موارد را ندارم مثلاً نمی خواهم با استفاده از پشته ها، عبارات ریاضی را محاسبه کنم(برای قسمت دوم) و یا اینکه نمی خواهم دستوراتم را در یک تابع بگذارم و سپس آن تابع را اجرا کنم چرا که این دستورات Dynamic هستند و دائم در حال تغییر می باشند و فقط می خواهم، آنها را اجرا کنم. از این موضوع نیز در تهیه یک گزارش می خواهم استفاده کنم. در این گزارش به دلیل نارسایی سیستم حسابداری موسسه ای که برای آن کار می کنم، فیلدهای گزارش باید توسط فرمول های پیچیده ای محاسبه شوند و این فرمول ها ممکن است تغییر کند، به همین دلیل قصد ندارم چیز ایستایی بسازم که فعلاً کار کند و فردا با هر تغییر مجبور شوم مجدداً ... . می خواهم فرمولهای کلی برای تهیه گزارش آماده کنم و جزئیات آنها را در پایگاه ذخیره کنم تا در صورت تغییرات، مجبور باشم فقط جزئیات و پارامتر ها را عوض کنم ولی کلیات ثابت بمانند. این جزئیات نیز دقیقاً همان دستورات #C می باشند. همچنین یک مورد دیگر: آیا می توان از صحت کامپایل این کد ها نیز خبر دار شد؟ منظورم این است که آیا می توان فهمید که این کدها در برنامه امکان کامپایل و لینک و ... دارند یا خیر(به هر دلیلی مانند خطای لغوی یا گرامری یا لینکی یا ...)؟
منتظر پاسخ شما دوستان هستم.
یا علی
حق نگهدارتان

اَرژنگ
دوشنبه 18 شهریور 1387, 17:35 عصر
با تشکر فراوان از اینکه برایه سوالتان قبل از پرسیدن زمان گذاشتید و سوالتان را به شکل کامل مطرح کردید.
برایه شروع به CodeDOM نگاه بندازید و برایه ادامه بازهم در خدمت شما هستیم.
واقعا جایه خوشحالی است که کسانی هستند مانند شما که قبل پرسیدن پژوهش میکنند و برایه سوالشان و زمان دیگران اهمیت قائل میشند. واقعا از دیدن سوالهایه مبهم و بی معنی بعضیها خسته شده بودم، این پست شما باعث امیدواری است که کسانی هستند که در سطح بالاتر برایه یادگیری زمان صرف میکنند. امیدوارم بقیه هم مانند شما برایه یادگیری زمان بگذارند.

bsng110
دوشنبه 18 شهریور 1387, 19:42 عصر
هوالحکیم
سلام مجدد خدمت دوستان عزیز به خصوص اَرژنگ گرامی
از اینکه شما نیز فرصت گذاشتید و پاسخ سوال بنده را دادید، بینهایت سپاسگزارم. فضای نام جالبی را معرفی کردید. با استفاده از کلاس های این فضای نام می توانستیم یک کد #C تولید کنیم مثلاً یک فایل که دارای چندین فضای نام است و در هر کدام چندین کلاس و در هر کلاس، چندین صفت و چندین متد و ... . خلاصه فضای نام خیلی جالبی بود. دست شما درد نکند ولی متأسفانه بنده عکس این کلاس را می خواهم یعنی کد را در اختیار دارم، می خواهم کامپایل و اجرا کنم. مثلاً می خواهم کد ;i = i + 1 را در یک مقطع از برنامه اجرا کنم. فرض کنید در تابعی هستم که متغییر i در آن از نوع int تعریف شده است و می خواهم این دستور را در آن اجرا کنم. این دستور نیز به صورت رشته ای می باشد بنابراین ابتدا باید کامپایل شود و برای آن کد میانی تولید شود و سپس در صورت رد کردن تمام مراحل کامپایل و ...، این کد در همین قسمت از برنامه اجرا شود. مثلاً فرض کنید تابعی به نام executeInLine وجود دارد که رشته ای را می گیرد و اجرا می کند. به عبارتی من می خواهم دستور ;("executeInLine("i = i + 1 را اجرا کنم که نتیجه این دستور باید موجب شود که مقدار i یک واحد افزایش یابد ولی همانطور که گفتم این دستور متغییر است یعنی ممکن است چند هفته دیگر این دستور باید با ;i = i * 3 عوض شود. برنامه نیز قرار است در یک محیط شبکه ای اجرا شود و حوصله اصلاح کد و کامپایل مجدد و انتشار آن در بین رایانه ها را ندارم(حتی اگر کد بر روی سرور باشد، باز هم به نظر من این امر کار صحیحی نمی باشد، بنابراین حتی الامکان باید بتوانم کد را در پایگاه داده ذخیره کنم و در صورت نیاز، فقط فیلد پایگاه داده را تغییر دهم). همچنین در مورد برنامه هم باید بگویم که نمی دانم چرا برنامه بر روی سرور اجرا نمی شود یعنی وقتی برنامه را در یک شاخه در سرور به اشتراک می گذارم و آن را از روی یکی از client ها اجرا می کنم، خطایی صادر می شود که می گوید نمی تواند برنامه را اجرا کند ولی وقتی برنامه را بر روی رایانه کاربر کپی می کنم و اجرا می کنم، برنامه مشکلی ندارد و اجرا می شود! نمی دانم این معماری 3 لایه شبکه را پس چگونه باید استفاده کرد! حال از این قضیه صرف نظر می کنم چرا که هنوز برنامه تکمیل نشده است.
منتظر پاسخ شما دوستان و بزرگان هستم.
یا علی
حق نگهدارتان

linux
دوشنبه 18 شهریور 1387, 21:03 عصر
هوالحکیم
سلام عرض می کنم خدمت دوستان و اساتید محترم سایت
ببخشید که این سوال را مطرح می کنم ولی من خیلی جستجو کردم و چیزی در این مورد که می خواهم بیان کنم، در سایت پیدا نکردم. من نیاز دارم که یک یا چند دستور #C را که به صورت text دارم(با فرض اینکه از صحت کامپایل آنها مطمئن هستم) اجرا کنم. دقت کنید که می خواهم این عمل در زمان اجرا صورت گیرد، مثلاً فرض کنید قطعه کدی در زمان اجرا از طریق پایگاه داده یا حتی یک textbox ساده، گرفته می شود و می خواهیم این قطعه کد اجرا شود. برای این منظور باید از چه کلاسی استفاده کنم(کلاس را هم که بگویید، ان شاء الله می توانم بقیه اش را پیدا کنم اما اگه کد آماده هم داشته باشید که دیگه خیلی شرمنده تون می شم). در ضمن باید بگویم که دیده ام با استفاده از کلاس های System.Reflection از اسمبلی یک کلاس یا ... می سازند و یا اینکه از طریق System.Runtime چیز هایی مثل اجرای متد از dll انجام می دهند و ... ولی نمونه چیزی که می خواهم را ندیده ام. همچنین سوال دیگری که داشتم در مورد محاسبه گر بود، مثلاً فرض کنید یک عبارت ریاضی به صورت 2*3+5-6 داریم و می خواهیم نتیجه آن را بدانیم(این عبارت به صورت text می باشد). آیا در NET. کلاس هایی(یا متدهایی) برای این منظور در نظر گرفته شده است یا خیر؟
اگر دوستان در این زمینه ها اطلاعاتی دارند، ممنون می شوم در اختیار بنده نیز قرار دهند. دقت کنید که خودم قصد پیاده سازی این موارد را ندارم مثلاً نمی خواهم با استفاده از پشته ها، عبارات ریاضی را محاسبه کنم(برای قسمت دوم) و یا اینکه نمی خواهم دستوراتم را در یک تابع بگذارم و سپس آن تابع را اجرا کنم چرا که این دستورات Dynamic هستند و دائم در حال تغییر می باشند و فقط می خواهم، آنها را اجرا کنم. از این موضوع نیز در تهیه یک گزارش می خواهم استفاده کنم. در این گزارش به دلیل نارسایی سیستم حسابداری موسسه ای که برای آن کار می کنم، فیلدهای گزارش باید توسط فرمول های پیچیده ای محاسبه شوند و این فرمول ها ممکن است تغییر کند، به همین دلیل قصد ندارم چیز ایستایی بسازم که فعلاً کار کند و فردا با هر تغییر مجبور شوم مجدداً ... . می خواهم فرمولهای کلی برای تهیه گزارش آماده کنم و جزئیات آنها را در پایگاه ذخیره کنم تا در صورت تغییرات، مجبور باشم فقط جزئیات و پارامتر ها را عوض کنم ولی کلیات ثابت بمانند. این جزئیات نیز دقیقاً همان دستورات #C می باشند. همچنین یک مورد دیگر: آیا می توان از صحت کامپایل این کد ها نیز خبر دار شد؟ منظورم این است که آیا می توان فهمید که این کدها در برنامه امکان کامپایل و لینک و ... دارند یا خیر(به هر دلیلی مانند خطای لغوی یا گرامری یا لینکی یا ...)؟
منتظر پاسخ شما دوستان هستم.
یا علی
حق نگهدارتان
این دقیقا همون چیزی هست که می خواهی http://www.personalmicrocosms.com/pages/cspcalc.aspx
سورسش هم هست.

H2K
سه شنبه 19 شهریور 1387, 01:37 صبح
سلام
دوستان لطف کنید در نقل قول کردن پست ها دقت بیشتری کنید.
گاهی وقت ها واقعا لزومی نداره که همه صحبت مخاطب، نقل قول بشه..
اینجوری حجم صفحات هم کمتر می شود و هم ظاهر تاپیک ها زیبا تره..
با تشکر

RED-C0DE
سه شنبه 26 شهریور 1387, 03:14 صبح
این کامپوننت همونیه که می خواستی... (البته اگه چیز آماده می خواستی)


http://www.alvas.net/Image/alvas.scriptor1.gif

http://www.alvas.net/alvas.scriptor.aspx