<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Iran Developers Network &#187; سی شارپ</title>
	<atom:link href="http://www.irandevelopers.com/category/programming/csharp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.irandevelopers.com</link>
	<description>IDN بزرگترین مرجع توسعه دهندگان ایران - آموزش زبانهای برنامه نويسی</description>
	<lastBuildDate>Mon, 23 Aug 2010 08:51:43 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>اصل قابلیت جانشینی در طراحی کلاس ها &#8211; LSP</title>
		<link>http://www.irandevelopers.com/programming/csharp/lsp-class-2152/</link>
		<comments>http://www.irandevelopers.com/programming/csharp/lsp-class-2152/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 21:01:42 +0000</pubDate>
		<dc:creator>حمید احمدی بهنام</dc:creator>
				<category><![CDATA[سی شارپ]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LSP]]></category>
		<category><![CDATA[method hiding]]></category>
		<category><![CDATA[override]]></category>
		<category><![CDATA[virtual]]></category>
		<category><![CDATA[طراحی كلاس]]></category>
		<category><![CDATA[وراثت]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/uncategorized/-2152/</guid>
		<description><![CDATA[LSP مخفف عبارت Liskov Substitutability Principle می باشد و منظور از آن ارایه قانونی است که هنگام طراحی کلاس ها باید رعایت شود به گونه ای که بتوان instance های کلاس وارث را به جای instance های کلاس پایه در برنامه به کار برد. بنابراین می توان از آن به عنوان یک راهنما هنگام نوشتن [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;">LSP مخفف عبارت <strong>L</strong>iskov <strong>S</strong>ubstitutability <strong>P</strong>rinciple می باشد و منظور از آن ارایه قانونی است که هنگام طراحی کلاس ها باید رعایت شود به گونه ای که بتوان instance های کلاس وارث را به جای instance های کلاس پایه در برنامه به کار برد. بنابراین می توان از آن به عنوان یک راهنما هنگام نوشتن کلاس های جدید استفاده کرد.</span></p>
<p><span style="font-size: small;">همانطور که می دانید وراثت یک مفهوم کلیدی در برنامه نویسی شی گراست. با کمک وراثت می توان یک رفتار اساسی و پایه برای یک مجموعه کلاس که همگی نیار به انجام این رفتار پایه را دارند، ایجاد نمود.</span></p>
<p><span style="font-size: small;">با توجه به قوانین حاکم بر مفوم وراثت در برنامه نویسی شی گرا می دانیم که می توان یک reference از کلاس پایه ایجاد کنیم ولی در عمل به جای اینکه این reference به یک object از نوع همان کلاس پایه اشاره کند،‌ آن را به object ای از نوع کلاس مشتق شده از آن کلاس پایه ارجاع دهیم. بدیهی است که خلاف این گفتار صادق نیست و نمی توان reference از نوع کلاس وارث را به object ای از نوع کلاس پایه ارتباط داد.</span></p>
<p><span style="font-size: small;">فرض کنید دو کلاس به نام های General و Special داریم که Special از General ارث برده است:‌</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">class General</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">{</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">public void PrintReport()</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">{</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">MessageBox.Show(&#8220;This is from General Class!&#8221;);</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">}</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">}</span></p>
<p style="text-align: left;" dir="ltr">
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">class Special : General</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">{</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">public void PrintReport()</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">{</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">//Do Somthing else.</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">}</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">}</span></p>
<p><span style="font-size: small;">همانطور که می بینید هر دو کلاس دارای متدی به نام PrintReport می باشند ولی‌ فرض می کنیم از لحاظ ماهیت عملکرد ،‌ این دو متد یکسان نیستند و رفتار متفاوتی از خود نشان می دهند.</span></p>
<p><span style="font-size: small;">با توجه به آنچه که در مورد قوانین مربوط به وراثت گفته شد می توان نوشت:‌</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">General generalObj = new General();</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">Special specialObj = new Special();</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">General generalObj2 = new <strong>Special()</strong>;</span></p>
<p><span style="font-size: small;">اکنون فرض کنید کلاس دیگری به نام Report داریم که دارای متدی به نام Reporter می باشد که به صورت public و static است.</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">class Report</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">{</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">public static void Reporter(General instance)</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">{</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">instance.PrintReport();</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">}</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">}</span></p>
<p><span style="font-size: small;">حال اگر بخواهیم از متد Reporter از کلاس Report استفاده کنیم با توجه به static بودن متد می توان نوشت:‌</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">Report.Reporter(generalObj);</span></p>
<p><span style="font-size: small;">با اجرای این دستور مشخص است که متد PrintReport مربوط به generalObj که object ای از کلاس General میباشد اجرا می شود. همانطور که قبلاً‌ اشاره شد،‌ می توانیم object ای از کلاس مشتق شده را به reference ای از کلاس پایه نسبت دهیم بنابراین می توانیم object ای از کلاس Special را به عنوان آرگومان به متد Reporter ارسال نماییم. و مشکل دقیقاً‌از همین جا آغاز می شود. مشکلی که LSP سعی در جلوگیری از وقوع آن را دارد.  برای توضیح بیشتر اگر بنویسیم:‌</span></p>
<p style="text-align: left;" dir="ltr"><span style="font-size: small;">Report.Reporter(specialObj);</span></p>
<p><span style="font-size: small;">با اجرای این دستور متد PrintReport از specialObj که object ای از کلاس Special می باشد اجرا می گردد. ولی می دانیم که PrintReport ‌مربوط به کلاس General و Special دو عملکرد متفاوت از خود نشان می دهند. بنابراین رفتار برنامه هنگامی که یک instance از کلاس پایه را به عنوان آرگومان به متد Reporter می فرستیم در مقایسه با حالتی که یک instance از کلاس مشتق شده را به Reporter ارسال می نماییم متفاوت خواهد بود و این یعنی کلاس مشتق شده نمی تواند جایگزین مناسبی برای کلاس پایه باشد.</span></p>
<p><span style="font-size: small;"><em>توضیح:‌ در این مقاله کوتاه سعی شده است </em><em>LSP</em><em> ،‌ ابتدا در حالت کلی و صرف نظر از ویژگی های زبان های برنامه نویسی شرح داده شود و سپس در ادامه نحوه وقوع آن در زبان </em><em>C#</em><em> مورد بررسی قرار گرفته است. دستوری که در بالا بدان اشاره شد به دلیل وقوع </em><em>Method Hiding</em><em> در زبان </em><em>C#</em><em> ،‌ منجر به نقض </em><em>LSP</em><em> نمی شود و استفاده از قطعه کد مربوطه تنها به منظور بیان مفوم </em><em>LSP</em><em> و جلب توجه خواننده به این نکته است که جایگزینی کلاس وارث به جای کلاس پایه می تواند منجر به ایجاد مشکل در عملکرد برنامه شود. </em></span></p>
<p><span style="font-size: small;">LSP در واقع به همین موضوع اشاره می کند که نحوه ی طراحی کلاس ها باید به گونه ای باشد که کلاس های وارث بتوانند به عنوان جانشین برای کلاس هایی که از آن ها ارث برده اند به کار روند به شکلی که رفتار برنامه با این جانشینی تغییر نکند.</span></p>
<p><span style="font-size: small;">در زبان C# می توانیم در دو حالت متد های تکراری که دارای امضای یکسانی هستند را هم در کلاس پایه و هم در کلاس مشتق شده داشته باشیم. یک حالت این است که از روش Method Hiding استفاده کنیم به این صورت که متدی با نام و امضای یکسان هم در کلاس پایه و هم در کلاس وارث داشته باشیم. البته در این حالت کامپایلر به منظور اعلام Method Hiding یک warning می دهد که می توان برای اینکه مشخص شود اینکار آگاهانه صورت می گیرد از کلمه کلیدی new در اعلان متد استفاده کنیم.</span></p>
<p><span style="font-size: small;">نکته ای که وجود دارد این است که حتی اگر به جای ارسال object ای از نوع General به متد Reporter ،‌ یک object از نوع Special بفرستیم ،‌ از آنجایی که متد تکراری بر اساس Method Hiding است ،‌ در هر صورت متد PrintReport مربوط به General اجرا می گردد. بنابراین عدم یکسان بودن رفتار متد های PrintReport منجر به رفتار متفاوت برنامه نمی گردد لذا اصل LSP‌ در این حالت نقض نمی شود.</span></p>
<p><span style="font-size: small;">حالت دیگر در مورد متد های تکراری این است که متدی که در کلاس پایه تعریف شده است ،‌ به صورت virtual &#8220;و&#8221; متدی که در کلاس وارث است به صورت override تعریف شده باشد (متد virtual در کلاس وارث override شود). در این وضعیت اگر object ای از نوع Special‌ را به Reporter‌ ارسال نماییم ،‌ متد PrintReport مربوط به Special اجرا می گردد در صورتی که اگر یک instance از نوع General ارسال می شد ،‌ متد PrintReport مربوط به General اجرا می شد. بنابر این در این حالت یکسان نبودن رفتار متد های PrintReport هنگامی که یک object کلاس وارث به جای یک object کلاس پایه مورد استفاده قرار می گیرد منجر به متفاوت شدن رفتار برنامه و در نتیجه نقض شدن اصل LSP می گردد. کاری که برای جلوگیری از این وضعیت می توان انجام داد این است که هنگام override کردن متد virtual ماهیت عملکرد متد متفاوت نباشد،‌ هر چند که طبیعی است با توجه شرایط کلاسی که درون آن override شده است سفارشی شده باشد. قابل توجه است که اگر object ای از نوع کلاس وارث به صورت ضمنی یا صریح به object ای از نوع کلاس پایه تبدیل شود،‌ تنها در صورتی می تواند از متد های <em>تکراری</em> خودش استفاده کند که این متد ها override شده باشند و به صورت Method Hiding نباشند.</span></p>
<p><span style="font-size: small;">نویسنده:‌ حمید احمدی بهنام</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/csharp/lsp-class-2152/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>چند زبانی در NET.</title>
		<link>http://www.irandevelopers.com/programming/multilanguageindotnet880113-1801/</link>
		<comments>http://www.irandevelopers.com/programming/multilanguageindotnet880113-1801/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 17:23:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1801</guid>
		<description><![CDATA[یکی از برتری‎های NET. نسبت به رقیب این است که شما می توانید از چندین زبان برنامه نویسی در یک برنامه استفاده نمائید. حسن این قابلیت حداقل در این است که افراد تیم برنامه نویسی شما مجبور نیستند که همگی تنها یک زبان را بدانند و شما هم بهتر و زودتر می توانید تیم خود [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">یکی از برتری‎های NET. نسبت به رقیب این است که شما می  توانید از چندین زبان برنامه نویسی در یک برنامه استفاده نمائید. حسن این قابلیت  حداقل در این است که افراد تیم برنامه نویسی شما مجبور نیستند که همگی تنها یک زبان  را بدانند و شما هم بهتر و زودتر می توانید تیم خود را تشکیل دهید.</span> <!--<A href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;><!-- Ads --><!-- 			<TABLE id=Table1 cellSpacing=0 cellPadding=1 align=center border=0> <TR> <TD align=center><FONT class=smalltext  				color=#666666>آگهی</FONT></TD></TR> <TR> <TD> <a id="_ctl0_Body1_AdRotator1" href="/whatever/ads.aspx" target="_top"><img src="/Images/banner/ads300x250.gif" alt="ads300x250 چند زبانی در NET." border="0" title="چند زبانی در NET." /></a></TD></TR></TABLE> &#8211;><!-- Ads --></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;>احتمالا به این مطلب برخورد کرده اید که یکی از ادعاهای Microsoft در ارائه NET.  چند زبانه بودن آن است. در این مقاله می خواهیم این موضوع را بررسی  کنیم.</p>
<p>چند زبانه بودن به این معنی است که ما می توانیم قسمتهای مختلف یک  برنامه را به زبانهای مختلف بنویسیم و آنها بدون هیچ مشکلی در کنار هم کار کنند. در  NET. بدلیل استفاده زبانها از کتابخانه کلاس NET. تفاوت آنها فقط در نحوه نوشتاری  دستورات می باشد مثلا زبان #C هیچ برتری خاصی نسبت به VB.NET ندارد و انتخاب بین  یکی از این زبانها به سلیقه و علاقه برنامه نویس بستگی دارد (البته من خودم VB را  به دلیل دارا بودن Syntax واضح تر ترجیح می دهم).</p>
<p>اما اگر می خواهید همزمان  از چند زبان استفاده کنید مثال ساده زیر شاید بتواند راهنمایی برای شما باشد. در  مثال زیر می خواهیم از زبانهای VB.Net و #C در یک برنامه Windows Application  استفاده کنیم:</p>
<p>- ابتدا یک پروژه VB با نام MyvbProj در NET. ایجاد  کنید.</p>
<p>- سپس در Solution Explorer روی نام Solution کلیک راست کرده و از  منوی Add گزینه New Project را انتخاب کنید.</p>
<p>- یک پروژه #C با نام MycsProj  اضافه کنید.</p>
<p>- حال در Solution Explorer روی پروژه Mycsproj کلیک راست کرده  و Properties را انتخاب کنید.</p>
<p>- در پنجره باز شده Output Type را از Windows  Application به Class Library تغییر دهید.</p>
<p>- سپس در Solution Explorer روی  نام Solution کلیک راست کرده و گزینه Solution Build را انتخاب کنید.</p>
<p>- حال  در قسمت Referencese پروژه Myvbproj کلیک راست کرده و گزینه Referencese Add را  انتخاب کنید.</p>
<p>- در پنجره باز شده به قسمت Projects رفته و Mycsproj را  انتخاب و Select را انتخاب کنید و Ok را بزنید.</p>
<p>حال می توانید در داخل پروژه  VB از اجزای پروژه #C استفاده کنید مثلا می توانیم با قرار دادن یک کنترل Button در  فرم مربوط به پروژه VB و نوشتن کد زیر برای رویداد کلیک آن فرم مربوط به پروژه #C  را نشان دهیم:</p>
<div class="MultiLineCode">Dim Frm as new Mycsproj.Form1<br />
Frm.ShowDialog(Me)</div>
<p>به همین روش شما می توانید در یک برنامه از چندین زبان استفاده کنید این روش  زمانی مفید است که یک تیم برنامه نویس روی یک برنامه کار می کنند و هر کدام از اعضا  مایل به برنامه نویسی با یک زبان خاص می باشد</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/multilanguageindotnet880113-1801/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>آشنائی با زبان #C</title>
		<link>http://www.irandevelopers.com/programming/introcsharp880103-1712/</link>
		<comments>http://www.irandevelopers.com/programming/introcsharp880103-1712/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 15:46:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1712</guid>
		<description><![CDATA[مایکروسافت در مصاف با جاوا، بدنبال ارائه یک زبان کامل بود که سایه جاوا را در میادین برنامه نویسی کم رنگ تر نماید. شاید بهمین دلیل باشد که #C را ایجاد کرد. شباهت های بین دو زبان بسیار چشمگیر است. مایکروسافت در رابطه با میزان استفاده و گسترش زبان فوق بسیار خوشبین بوده و امیدوار [...]]]></description>
			<content:encoded><![CDATA[<p>مایکروسافت در مصاف با جاوا، بدنبال ارائه یک زبان کامل بود که سایه جاوا را در میادین برنامه نویسی کم رنگ تر نماید. شاید بهمین دلیل باشد که #C را ایجاد کرد. شباهت های بین دو زبان بسیار چشمگیر است. مایکروسافت در رابطه با میزان استفاده و گسترش زبان فوق بسیار خوشبین بوده و امیدوار است بسرعت زبان فوق گستردگی و مقبولیتی به مراتب بیشتر از جاوا را نزد پیاده کنندگان نرم افزار پیدا کند.</p>
<p>با توجه به نقش محوری این زبان، از آن بعنوان مادر زبانهای برنامه نویسی در دات نت نام برده می شود. مورد فوق به تنهائی، می تواند دلیل قانع کننده ای برای یادگیری این زبان باشد، ولی دلایل متعدد دیگری نیز وجود دارد که در ادامه به برخی از آنها اشاره می گردد.</p>
<p>مطرح شدن بعنوان یک استاندارد صنعتی<br />
انجمن تولیدکنندگان کامپیوتر اروپا (ECMA) زبان #C را در سوم اکتبر سال ۲۰۰۱ بعنوان یک استاندارد پذیرفته (ECMA-334) و بدنبال آن تلاش های وسیعی برای کسب گواهی ISO نیز انجام شده است. زبان فوق در ابتدا توسط شرکت مایکروسافت و بعنوان بخشی از دات نت پیاده سازی و بلافاصله پس از آن توسط شرکت های اینتل، هیولیت پاکارد و مایکروسافت مشترکا، جهت استاندارسازی پیشنهاد گردید.</p>
<p>زبان #C بگونه ای طراحی شده است که نه تنها وابستگی به یک Platform خاص را ندارد، بلکه در اغلب موارد وابستگی RunTime نیز ندارد. کامپایلر #C می تواند بر روی هر نوع معماری سخت افزاری طراحی و اجرا گردد. در برخی از نسخه های اولیه کامپایلر زبان فوق که توسط برخی از شرکت های جانبی ارائه شده است، کدهای #C را به بایت کدهای جاوا کمپایل می کنند. یکی از چنین کامپایلرهائی را می توان در سایت Halcyonsoft.com مشاهده نمود. بنابراین کدهای #C براحتی قابلیت حمل بر روی محیط های متفاوت را دارا خواهند بود.</p>
<p>مشخصات تعریف شده زبان #C با سایر استاندارهای تعریف شده ECMA نظیر (ECMA-335) CLI (Common Language Infrastructure) بخوبی مطابقت می نمایند. CLI قلب و روح دات نت و CLR(Common Language Runtime) است. اولین نسخه از کامپایلر زبان #C که از CLI استفاده می کند، NET Framwork. مایکروسافت است.</p>
<p>با توجه به موارد گفته شده، مشخص می گردد که این زبان بسرعت بسمت استاندارد شدن حرکت و با تایید استانداردهای مربوطه از طرف انجمن های معتبر بین المللی و حمایت فراگیر شرکت های معتبر کامپیوتری در دنیا مسیر خود را بسمت جهانی شدن بخوبی طی می نماید.</p>
<p>#C چیست ؟<br />
طراحان زبان #C با تاکید و الگوبرداری مناسب از مزایای زبانهائی نظیر ++C، C و جاوا و نادیده گرفتن برخی از امکانات تامل برانگیز و کم استفاده شده در هر یک از زبانهای فوق، یک زبان برنامه نویسی مدرن شی گراء را طراحی کرده اند. در مواردی، برخی از ویژگی های استفاده نشده و درست درک نشده در هر یک از زبانهای گفته شده، حذف و یا با اعمال کنترل های لازم بر روی آنها، زمینه ایجاد یک زبان آسان و ایمن برای اغلب پیاده کنندگان نرم افزار بوجود آمده است. مثلا C و ++C می توانند مستقیما با استفاده از اشاره گرها عملیات دلخواه خود را در حافظه انجام دهند. وجود توانائی فوق برای نوشتن برنامه های کامپیوتری با کارائی بالا ضرورت اساسی دارد. اما در صورتیکه عملیاتی اینچنین بدرستی کنترل و هدایت نگردند، خود می تواند باعث بروز مسائل (Bugs) بیشماری گردد.</p>
<p>طراحان زبان #C، با درک اهمیت موضوع فوق، این ویژگی را کماکان در آن گنجانده ولی بمنظور ممانعت از استفاده نادرست و ایجاد اطمینان های لازم مسئله حفاظت نیز مورد توجه قرار گرفته است. جهت استفاده از ویژگی فوق، برنامه نویسان می بایست با صراحت و به روشنی خواسته خود را از طریق استفاده از Keyword های مربوطهاعلان نمایند( فراخوانی یک توانائی و استفاده از آن).</p>
<p>#C بعنوان یک زبان شی گراء عالی است. این زبان First-Class را برای مفهوم Property (Data Member) بهمراه سایر خصائص عمومی برنامه نویسی شی گراء حمایت می کند. در C و ++C و جاوا یک متد get/set اغلب برای دستیابی به ویژگی های هر Property استفاده می گردد. CLI همچنان تعریف Property را به متدهای get/ser ترجمه کرده تا بدین طریق بتواند دارای حداکثر ارتباط متقابل با سایر زبانهای برنامه نویسی باشد. #C بصورت فطری Events ، Declared Value، Reference Type ، Operator Overloading را نیز حمایت می کند.</p>
<p>کد مدیریت یافته<br />
با استفاده از نسخه پیاده سازی شده #C توسط مایکروسافت، می توان همواره کد مدیریت یافته ای را تولید کرد. یک برنامه #C پس از کامپایل، بصورت برنامه ای در خواهد آمد که شامل دستورالعمل های تلفیق شده ( CIL (Common Intermediate Language است (درست بر خلاف دستورالعمل های مختص یک ماشین خاص). CIL (گاها با نام MSIL(Microsoft Intermediate Language) با به اختصار IL نیز نامیده می شود ) ، در مفهوم مشابه بایت کدهای جاوا بوده و شامل مجموعه ای از دستورالعمل های سطح پایین قابل فهم توسط تکنولوژی مبتنی بر CLI نظیر CLR مایکروسافت خواهد بود. این برنامه ها بدین دلیل کد مدیریت یافته، نامیده می شوند که CLR مسئولیت تبدیل این دستورالعمل ها به کدهای قابل اجرا برروی ماشین و ارائه اغلب سرویس های اساسی برای کدینگ نظیر : Garbage Collection، مدیریت Heap و عمر مفید یک Object و یا Type Verification را فراهم می کند.</p>
<p>روش یادگیری #C<br />
یادگیری این زبان برای افرادیکه دارای سابقه آشنائی با یکی از زبانهای برنامه نویسی ++C، C و یا جاوا باشند کار مشکلی نخواهد بود، حتی افرادیکه دارای آشنائی اولیه با جاوااسکریپت و یا دیگر زبانهای برنامه نویسی نظیر ویژوال بیسک می باشند، امکان پذیر و راحت خواهد بود. برخی از برنامه نویسان حرفه ای بر این باور هستند که #C نسبت به VB.NET با اقبال بیشتر و سریعتری مواجه خواهد شد، چراکه #C نسبت به ویژوال بیسک خلاصه تر است. حتی برنامه های بزرگ و پیچیده ای که توسط #C نوشته می گردند خواناتر، کوتاه و زیبا خواهند بود. برخی از ویژگی های ارائه شده در #C نظیر Unsigned Integer، Operator OverLoading و امنیت بیشتر Type ها، در VB.NET وجود نداشته و این امر می تواند دلیلی بر فراگیرتر شدن #C نسبت به VB.NET نزد برنامه نویسان با تجربه باشد.</p>
<p>برای یادگیری هر یک از زبانهای حمایت شده در دات نت، می بایست از BCL (Basic Class Library) مربوط به NET Framework. شروع کرد. #C خود صرفا دارای ۷۷ کلمه کلیدی یا Keyword بوده که برای اکثر برنامه نویسان غریب نخواهند بود. در مقابل BCL، دارای ۴۵۰۰ کلاس و تعداد بیشماری متد و Property است که برنامه نویسان #C، می توانند از آنها برای انجام عملیات دلخواه خود استفاده نمایند. شاید یکی از مسائل قابل توجه جهت یادگیری این زبان برای برخی از برنامه نویسان حرفه ای عدم وجود برخی از ویژگی ها و امکاناتی باشد که در گذشته و از طریق سایر زبانهای استفاده شده، بخدمت گرفته می شدند. مثلا عدم وجود امکاناتی جهت توارث چندگانه (MI) سلسله مراتبی یک شئ.</p>
<p>خلاصه<br />
بدون شک فراگیری و تسلط بر زبان #C بمنزله کسب یک پتانسیل با ارزش بوده که ثمرات آن برای برنامه نویسان در حال و آینده ای نه چندان دور بیشتر هویدا خواهد شد. استاندارد بودن و وجود کتابخانه ای مملو از کلاس این اطمینان را بوجود خواهد آورد که با فراگیری زبان فوق و کسب، مهارت های لازم، به یک توانائی فرا محیطی جدید دست پیدا خواهیم کرد که امکان استفاده از آن بر روی محیط های متفاوت وجود خواهد داشت. ویژگی ها و قابلیت های بیشمار این زبان از جمله دلایل قانع کننده دیگری است که فراگیری آن را توجیه پذیر و منطقی می کند.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/introcsharp880103-1712/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>شئ گرایی در #C</title>
		<link>http://www.irandevelopers.com/programming/objectorientedcsharp880102-1710/</link>
		<comments>http://www.irandevelopers.com/programming/objectorientedcsharp880102-1710/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 15:44:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1710</guid>
		<description><![CDATA[دنیای برنامه نویسی امروزه بر مفهوم شئ گرایی استوار است. شئ گرایی به زبان ساده یعنی دنیا را آنطور ببنیم که هست! زبان #C یکی از بهترین زبانهایی است که دارای تمامی امکانات جهت پیاده سازی مفاهیم اصیل شئ گرایی است. در این مقاله با برخی مفاهیم مهم شئ گرایی از دیدگاه زبان #C آشنا [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">دنیای برنامه نویسی امروزه بر مفهوم شئ گرایی استوار  است. شئ گرایی به زبان ساده یعنی دنیا را آنطور ببنیم که هست! زبان #C یکی از  بهترین زبانهایی است که دارای تمامی امکانات جهت پیاده سازی مفاهیم اصیل شئ گرایی  است. در این مقاله با برخی مفاهیم مهم شئ گرایی از دیدگاه زبان #C آشنا می شویم.  فراموش نکنید که قبل از خواندن این مقاله شما باید با مفهوم کلاس و شئ آشنا  باشید.</span> <!--<A href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;><!-- Ads --><!-- 			<TABLE id=Table1 cellSpacing=0 cellPadding=1 align=center border=0> <TR> <TD align=center><FONT class=smalltext  				color=#666666>آگهی</FONT></TD></TR> <TR> <TD> <a id="_ctl0_Body1_AdRotator1" href="/whatever/ads.aspx" target="_top"><img src="/Images/banner/ads300x250.gif" alt="ads300x250 شئ گرايی در #C" border="0" title="شئ گرايی در #C" /></a></TD></TR></TABLE> &#8211;><!-- Ads --></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;></p>
<p dir="rtl">شئ گرایی (OOP) در #C بر چند پایه استوار است که به قرار  زیرند:</p>
<div class="EnglishParag">- Inheritance<br />
- Encapsulation<br />
- Polymorphism<br />
-  Abstraction<br />
- Interface</div>
<p>اکنون به توضیح مختصر هر یک می پردازیم.</p>
<p><strong>Inheritance (ارث  بری)<br />
</strong><br />
پدر و فرزندی را در نظر بگیرید. هر پدری مشخصات فردی به خصوصی  دارد. فرزند وی می تواند همه خصوصیات او را به ارث برد و خصوصیتهای دیگری نیز داشته  باشد که پدرش ندارد. این یعنی ارث بری! برای مثال پدر وقتی عصبانی می شود، داد و  فریاد می کند. پسر هم این خصوصیت را به ارث می برد با این تفاوت که وقتی عصبانی می  شود، علاوه بر داد زدن، چند عدد بشقاب هم می شکند. در برنامه نویسی شئ گرا از مفهوم  ارث بری استفاده های زیادی می شود. برای تفهیم راحت تر مسئله فرض کنید کلاسی به نام  وسیله نقلیه داریم. از آنجا که هر وسیله نقلیه ای حرکت می کند، رنگ دارد، سرعت  دارد، ترمز می گیرد و&#8230; می توانیم همه این متدها و فیلدها( کدام متدها و فیلدها!؟)  را در کلاس وسیله نقلیه تعریف کنیم. حال یک وهله از این کلاس را در نظر بگیرید  (مثلا دوچرخه!). یک دوچرخه یک وسیله نقلیه است که همه خصوصیات عمومی یک وسیله نقلیه  را دارد و البته خصوصیاتی دارد که مختص خودش هستند و در انواع دیگر یافت نمی شوند.  به این منظور این دوچرخه می تواند ویژگیها و متدهای مشترک را از کلاس وسیله نقلیه  به ارث ببرد و در عین حال ویژگیهای منحصر به خود را نیز داشته باشد. قابلیت استفاده  دوباره از کد (Reusability) یکی از مزیات اصلی ارث بری  است.</p>
<p><strong>Encapsulation<br />
</strong><br />
همانطور که از اسمش پیداست، به قرار  دادن پیاده سازی در یک کپسول اشاره می کند، به طوری که کاربر بیرونی از نحوه پیاده  سازی مطلع نباشد و فقط بداند که این کپسول کار خاصی را انجام می دهد. وقتی یک کپسول  می خورید نمی دانید که در داخل آن چه چیزی هست و فقط به این فکر می کنید که این  کپسول چه تاثیری در بدن شما می گذارد!</p>
<p>فرض کنید سوار ماشینی هستید که به  سرعت در حرکت است! در مسیری که می روید ماشین پدر نامزدتان از روبرو به شما نزدیک  می شود و سعی می کنید سریع ترمز بگیرید تا برخورد نکنید. اگر قرار باشد که بدانید  بعد از فشار دادن پدال ترمز چه عملیاتی انجام می شود تا ترمز گرفته شود، دیگر باید  از ازدواج قطع امید کنید. ولی اگر تنها بدانید که با فشار دادن پدال، ترمز گرفته می  شود شما خوشبخت خواهید شد. در واقع ما در اینجا کار ترمز گرفتن ماشین را به صورت یک  کپسول آماده در نظر می گیریم. هدف Encapsulation این است که ما را از پرداختن به  ریز موضوعات رها کند و اشیاء را به صورت یک جعبه سیاهی بدانیم که به ازای یک ورودی  خاص خروجی خاصی می دهند. اگر می خواهیم کدهای ما نیز این مورد را رعایت کنند باید  سعی کنیم نگاه کپسولی به اشیاء و عملکرد آنها داشته باشیم. در #C برای کپسوله کردن  از Access Modifierهای protected ،private و public استفاده می شود.</p>
<p><strong>Polymorphism<br />
</strong><br />
فرض کنید پدر شما کار خاصی را به طریق خاصی  انجام می دهد. مثلا برای پختن غذا (حقیقتی است تلخ!) اول ظرفهای دیشب را شسته و بعد  گاز را روشن می کند و بعد غذا می پزد! شما که خصوصیات پدر و کارهای او را به ارث می  برید برای مثال برای پختن غذا ابتدا گاز را روشن می کنید، بعد کبریت می کشید، غذا  را می پزید و بعد ظرفهای دیشب را می شویید! (توصیه می کنم نگذارید ظرفهایتان نشسته  بمانند!) برادر شما ممکن است همین کار را به طریق دیگری انجام دهد. پختن غذا کاری  است که شما از پدر خود به ارث می برید!!! ولی آن را به طریق دیگری انجام می دهید.  یعنی یک کار ثابت توسط فرزندان مختلف یک پدر به طرق مختلفی انجام می شود. این دقیقا  همان چیزی است که به آن چند شکلی یا Polymorphism می  گویند.</p>
<p><strong>Abstraction<br />
</strong><br />
تجرید یا مجرد سازی! به  کلاسی مجرد گفته می شود که پیاده سازی متدها در آن انجام نمی شود! بر خلاف انسانها  که مجرد تعریف دیگری برایشان دارد! حال سئوالی پیش می آید که اگر کلاسی داشته باشیم  که نخواهیم پیاده سازی متدها را در آن انجام بدیم، از آن کلاس چه استفاده ای می  کنیم؟ برای پاسخ به این سئوال شرایط زیر را در نظر بگیرید:</p>
<p>فرض می کنیم که  شما رییس یک شرکت بزرگ برنامه نویسی هستید و می خواهید پروژه بزرگی را انجام دهید.  برای اجرای پروژه از برنامه نویسان مختلفی استفاده می کنید که ممکن است همه آنها  هموطن نباشند! مثلا هندی، ایرانی یا آلمانی باشند! اگر قرار باشد هر برنامه نویسی  در نامگذاری متدها و کلاسهایش آزاد باشد، در کد نویسی هرج و مرج به وجود می آید.  شما به عنوان مدیر پروژه، کلاسی تعریف می کنید که در آن تمام متدها با ورودی و  خروجی هایشان مشخص باشند. ولی این متدها را پیاده سازی نمی کنید و کار پیاده سازی  را به برنامه نویسان می دهید و از آنها می خواهید که همه کلاسهایی را که می نویسند  از این کلاس شما به ارث ببرند و متدها را به طور دلخواه پیاده سازی کنند. این باعث  می شود که شما با داشتن یک کلاس، ورودی و خروجی های مد نظر خود را داشته باشید و  دیگر نگران برنامه نویسان نباشید. کلاسی که شما تعریف می کنید یک کلاس مجرد نامیده  می شود.</p>
<p>برای تعریف یک کلاس مجرد از کلمه کلیدی abstract استفاده می کنیم.  فیلدهایی که می خواهیم در کلاسهای مشتق شده از این کلاس پیاده سازی شوند حتما باید  با abstract تعریف شوند. یک کلاس مجرد می تواند فیلدها و متدهای نامجرد داشته باشد.  اگر متد نامجردی در یک کلاس مجرد تعریف کردید، حتما باید آن را پیاده سازی کنید و  نمی توانید پیاده سازی آن را به کلاسهای مشتق شده  بسپارید.</p>
<p><strong>Interface<br />
</strong><br />
اینترفیس در برنامه نویسی همانند همان  کلاس است تنها با این تفاوت که هیچکدام از اعضای آن پیاده سازی نمی شوند. در واقع  یک اینترفیس گروهی از متدها، خصوصیات، رویدادها و Indexer ها هستند که در کنار هم  جمع شده اند. اینترفیس ها را نمی توان Instantiate (وهله سازی) کرد (یعنی نمی توان  وهله ای از یک اینترفیس ایجاد کرد!). تنها چیزی که یک اینترفیس دارا می باشد امضای  (signature) تمامی اعضای آن می باشد. به این معنی که ورودی و خروجی متدها، نوع  Property ها و&#8230; در آن تعریف می شوند ولی چیزی پیاده سازی نمی شود. اینترفیس ها  سازنده و فیلد ندارند (امری است بدیهی! چرا؟). یک اینترفیس نمی تواند Operator  Overload داشته باشد و دلیل آن این است که در صورت وجود این ویژگی، احتمال بروز  مشکلاتی از قبیل ناسازگاری با دیگر زبانهای NET. مانند VB.NET که از این قابلیت  پشتیبانی نمی کند وجود داشت. نحوه تعریف اینترفیس بسیار شبیه تعریف کلاس است تنها  با این تفاوت که در اینترفیس پیاده سازی وجود ندارد.</p>
<p>حالا این اینترفیس در  کجا به کار می آید؟ اگر با ++C کار کرده باشید ( در آن صورت کارتان خیلی درست می  باشد!!!) با واژه ارث بری چند گانه آشنا هستید. ولی احتمالا شنیدید که جاوا و #C از  ارث بری چندگانه پشتیبانی نمی کنند. (یعنی یک کلاس از چند کلاس دیگر به ارث ببرد).  گاهی لازم داریم از چند کلاس به ارث ببریم. راه حلش این است که از اینترفیس ها  استفاده کنیم. ولی بدانید که اگر از اینترفیسی به ارث بردید باید تمام متدهای آن را  پیاده سازی کنید. یک کلاس می تواند از n تا اینترفیس و تنها یک کلاس به ارث ببرد.<br />
</span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/objectorientedcsharp880102-1710/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>جستجو با استفاده از وب سرویس گوگل &#8211; قسمت دوم</title>
		<link>http://www.irandevelopers.com/programming/usegooglewebservicep2871230-1697/</link>
		<comments>http://www.irandevelopers.com/programming/usegooglewebservicep2871230-1697/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 15:33:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[تکنولوژی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1697</guid>
		<description><![CDATA[گوگل به برنامه نویسان یک وب سرویس برای جستجو در دیتابیس خود پیشنهاد می کند. به کمک این وب سرویس شما قادر خواهید بود تا یک وب سایت مشخص یا کل وب را به کمک شاخص های گوگل جستجو کنید و نتایج را به صورت سفارشی شده در وب سایت خود نمایش دهید. در این [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">گوگل به برنامه نویسان یک وب سرویس برای جستجو در  دیتابیس خود پیشنهاد می کند. به کمک این وب سرویس شما قادر خواهید بود تا یک وب  سایت مشخص یا کل وب را به کمک شاخص های گوگل جستجو کنید و نتایج را به صورت سفارشی  شده در وب سایت خود نمایش دهید. در این مقاله به چگونگی استفاده از این وب سرویس در  صفحات ASP.NET خواهیم پرداخت.</span> <!--<A href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;><!-- Ads --><!-- 			<TABLE id=Table1 cellSpacing=0 cellPadding=1 align=center border=0> <TR> <TD align=center><FONT class=smalltext  				color=#666666>آگهی</FONT></TD></TR> <TR> <TD> <a id="_ctl0_Body1_AdRotator1" href="/whatever/ads.aspx" target="_top"><img src="/Images/banner/ads300x250.gif" alt="ads300x250 جستجو با استفاده از وب سرویس گوگل   قسمت دوم" border="0" title="جستجو با استفاده از وب سرویس گوگل   قسمت دوم" /></a></TD></TR></TABLE> &#8211;><!-- Ads --></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;>در قسمت قبل این مقاله دیدید که چگونه به کمک وب سرویس گوگل در وب جستجو می  کنیم. در قسمت دوم خواهیم دید که چگونه می توان یک موتور جستجوی شبه گوگل ایجاد  کرد.</p>
<p><strong>ساختن یک موتور جستجوی کاربردی تر<br />
</strong><br />
برای ساختن یک موتور  جستجوی کاربردی تر با وب سرویس گوگل، اجازه دهید تا یک صفحه وب ASP.NET بسازیم که  به کاربر امکان وارد کردن عبارت مورد جستجو و همچنین صفحه بندی داده های بدست آمده  از جستجو را بدهد. یک راه برای انجام این کار، تقلید از گوگل است به این معنی که  کلمه مورد جستجو و شماره صفحات را در Query String قرار دهیم. به عنوان مثال اگر  کاربر کلمه &#8220;ASP&#8221; را جستجو کند و ۱۰ نتیجه از ۲۰ نتیجه بدست آمده نمایش داده شود،  آدرس درخواستی چیزی شبیه به این خواهد بود :<br />
&lt;  BR&gt;http://www.yourserver.com/Search.aspx?q=ASP&amp;first=10&amp;last=20</p>
<p>یک انتخاب دیگر استفاده از postback است. اما استفاده از Query String این  حسن را دارد که کاربر می تواند نتایج یک جستجوی خاص را bookmark کند (توجه کنید که  در روش postback به دلیل استفاده از هدرهای HTTP POST، آدرس و Query string موقع  جستجو یا صفحه بندی نتایج تغییری نمی کنند).</p>
<p>با وجود مزیت bookmark شدن در  روش Query String من تصمیم گرفتم تا کار را به کمک Postback در وب فرم ها انجام  دهم، اما شما اگر بخواهید، می توانید روش Query String را تعریف و استفاده کنید.  سورس کد روش Postback را در زیر مشاهده می کنید :</p>
<div class="MultiLineCode">&lt;script language=&#8221;VB&#8221; runat=&#8221;server&#8221;&gt;<br />
Const  PAGE_SIZE as Integer = 5</p>
<p>Sub execSearch(sender as Object, e as  EventArgs)<br />
ViewState(&#8220;startIndex&#8221;) = 0</p>
<p>DisplaySearchResults()<br />
End Sub</p>
<p>Sub nextRecs(sender as  Object, e as EventArgs)<br />
ViewState(&#8220;startIndex&#8221;) += PAGE_SIZE</p>
<p>DisplaySearchResults()<br />
End Sub</p>
<p>Sub prevRecs(sender  as Object, e as EventArgs)<br />
ViewState(&#8220;startIndex&#8221;) -= PAGE_SIZE</p>
<p>DisplaySearchResults()<br />
End Sub</p>
<p>Sub  DisplaySearchResults()<br />
searchResults.Visible = True</p>
<p>Dim search As google.GoogleSearchService = New  google.GoogleSearchService()<br />
Dim result as  google.GoogleSearchResult</p>
<p>result =  search.doGoogleSearch(&#8220;<em>license key&#8230;</em>&#8220;, searchTerms.Text,  _<br />
ViewState(&#8220;startIndex&#8221;), PAGE_SIZE, True, &#8220;&#8221;, True, &#8220;&#8221;,  &#8220;&#8221;, &#8220;&#8221;)</p>
<p>dlResults.DataSource = result.resultElements<br />
dlResults.DataBind()</p>
<p>lblSearchResults.Text = &#8220;Viewing records  &#8221; &amp; String.Format(&#8220;{0:#,###}&#8221;, _<br />
ViewState(&#8220;startIndex&#8221;)+1) &amp; &#8221; &#8211; &#8221; &amp; _<br />
String.Format(&#8220;{0:#,###}&#8221;, ViewState(&#8220;startIndex&#8221;) + _<br />
PAGE_SIZE) &amp; &#8221; of about &#8221; &amp; _<br />
String.Format(&#8220;{0:#,###}&#8221;, result.estimatedTotalResultsCount) &amp;  _<br />
&#8220;.  Search took &#8221; &amp; _<br />
String.Format(&#8220;{0:0.000}&#8221;, result.searchTime) &amp; &#8221; sec.&#8221;</p>
<p>btnPrev.Enabled = (ViewState(&#8220;startIndex&#8221;) &gt; 0)<br />
End Sub<br />
&lt;/script&gt;</p>
<p>&lt;form runat=&#8221;server&#8221;&gt;<br />
Enter your search  term: &lt;asp:TextBox runat=&#8221;server&#8221; id=&#8221;searchTerms&#8221; /&gt;<br />
&lt;asp:Button  runat=&#8221;server&#8221; Text=&#8221;Search&#8221; OnClick=&#8221;execSearch&#8221;  /&gt;<br />
&lt;p&gt;<br />
&lt;asp:panel id=&#8221;searchResults&#8221; runat=&#8221;server&#8221;  Visible=&#8221;False&#8221;&gt;<br />
&lt;table width=&#8221;100%&#8221; bgcolor=&#8221;#eeeeee&#8221;&gt;<br />
&lt;tr&gt;&lt;td align=&#8221;right&#8221;&gt;<br />
&lt;asp:Label id=&#8221;lblSearchResults&#8221;  runat=&#8221;server&#8221; /&gt;<br />
&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;</p>
<p>&lt;asp:DataList runat=&#8221;server&#8221; id=&#8221;dlResults&#8221;<br />
Font-Name=&#8221;Verdana&#8221;  Font-Size=&#8221;10pt&#8221;&gt;</p>
<p>&lt;ItemTemplate&gt;<br />
&lt;span  style=&#8221;font-size:15pt;font-weight:bold;&#8221;&gt;<br />
&lt;%#  Container.DataItem.title %&gt;<br />
&lt;/span&gt;&lt;br /&gt;<br />
&lt;%# Container.DataItem.snippet %&gt;&lt;br /&gt;<br />
[&lt;a href="&lt;%#  Container.DataItem.URL %&gt;"&gt;&lt;%# Container.DataItem.URL  %&gt;&lt;/a&gt;]<br />
&lt;/ItemTemplate&gt;</p>
<p>&lt;SeparatorTemplate&gt;<br />
&lt;p&gt; &lt;/p&gt;<br />
&lt;/SeparatorTemplate&gt;</p>
<p>&lt;/asp:DataList&gt;</p>
<p>&lt;table  width=&#8221;100%&#8221; bgcolor=&#8221;#eeeeee&#8221;&gt;<br />
&lt;tr&gt;&lt;td  align=&#8221;right&#8221;&gt;<br />
&lt;asp:LinkButton id=&#8221;btnPrev&#8221; runat=&#8221;server&#8221;  Text=&#8221;&lt; Prev.&#8221; OnClick=&#8221;prevRecs&#8221; /&gt; |<br />
&lt;asp:LinkButton  id=&#8221;btnNext&#8221; runat=&#8221;server&#8221; Text=&#8221;Next. &gt;&#8221; OnClick=&#8221;nextRecs&#8221; /&gt;<br />
&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/asp:Panel&gt;<br />
&lt;/form&gt;</p></div>
<p>مهمترین و اصلی ترین و پر کارترین تابع در کد بالا  DisplaySearchResults است که وب سرویس را فراخوانی می کند، داده ها را به دیتالیست  مقید ( bind ) می کند و اطلاعات متفرقه در مورد نتیجه پیدا شده مثل عدد تخمینی  تعداد نتایج، زمان اجرای کوئری و&#8230; را نمایش می دهد. این تابع همچنین فعال یا غیر  فعال بودن دکمه لینکی مربوط به صفحه بندی نتایج را مشخص می کند.</p>
<p>هنگامی که  وب سرویس را فراخوانی می کنیم، باید شاخص شروع نتایج و نیز تعداد نتایجی که می  خواهیم در یک صفحه ببینیم را مشخص کنیم. برای اینکه ۱۰ رکورد اول نتایج جستجو را  ببینیم، عدد صفر را به عنوان شاخص شروع و عدد ۱۰ را به عنوان تعداد رکوردهای  بازگشتی پاس می کنیم. برای دیدن ۱۰ نتیجه بعدی، فقط کافی است که عدد ۱۰ را به عنوان  شاخص شروع پاس کنیم (تعداد رکوردهای بازگشتی در این حالت هم همان ۱۰ تاست). توجه  کنید که ViewState برای مدیریت عدد شاخص شروع به کار رفته است. تعداد رکوردهایی که  در هر صفحه نمایش داده می شوند توسط ثابت PAGE_SIZE مشخص می شود.</p>
<p>برای امکان  صفحه بندی نتایج از دو دکمه لینکی استفاده شده است که وقتی روی آن ها کلیک می شود  هندلرهای nextRecs و prevRecs شروع به کار می کنند. این هندلرها تنها عدد شروع  رکوردها را به روز رسانی کرده و سپس DisplaySearchResults() را فراخوانی می  کنند.</p>
<p><strong>یک نکته مهم در رابطه با وب سرویس گوگل :<br />
</strong><br />
API وب سرویس  گوگل در حال حاضر در مرحله تست بتا قرار دارد و تنها برای مصارف شخصی آماده شده  است، برای محدود کردن استفاده افراطی، گوگل از استفاده کنندگان این سرویس می خواهد  تا یک license key منحصر به فرد داشته باشند (که به صورت مجانی قابل دریافت است)،  توضیح روش دریافت license key در قسمت اول این مقاله آمده است . این license key  برای محدود کردن فراخوانی وب سرویس به کمتر از ۱۰۰۰ بار در روز استفاده می شود.  لطفا <a href="../../www.google.com/apis/api_terms.html">api license terms</a> را  برای استفاده از وب سرویس گوگل مطالعه کنید.</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/usegooglewebservicep2871230-1697/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>جستجو با استفاده از وب سرویس گوگل &#8211; قسمت اول</title>
		<link>http://www.irandevelopers.com/programming/usegooglewebservicep1871230-1695/</link>
		<comments>http://www.irandevelopers.com/programming/usegooglewebservicep1871230-1695/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 15:31:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[تکنولوژی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1695</guid>
		<description><![CDATA[گوگل به برنامه نویسان یک وب سرویس برای جستجو در دیتابیس خود پیشنهاد می کند. به کمک این وب سرویس شما قادر خواهید بود تا یک وب سایت مشخص یا کل وب را به کمک شاخص های گوگل جستجو کنید و نتایج را به صورت سفارشی شده در وب سایت خود نمایش دهید. در این [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">گوگل به برنامه نویسان یک وب سرویس برای جستجو در  دیتابیس خود پیشنهاد می کند. به کمک این وب سرویس شما قادر خواهید بود تا یک وب  سایت مشخص یا کل وب را به کمک شاخص های گوگل جستجو کنید و نتایج را به صورت سفارشی  شده در وب سایت خود نمایش دهید. در این مقاله به چگونگی استفاده از این وب سرویس در  صفحات ASP.NET خواهیم پرداخت.</span> <!--<A href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;><!-- Ads --><!-- 			<TABLE id=Table1 cellSpacing=0 cellPadding=1 align=center border=0> <TR> <TD align=center><FONT class=smalltext  				color=#666666>آگهی</FONT></TD></TR> <TR> <TD> <a id="_ctl0_Body1_AdRotator1" href="/whatever/ads.aspx" target="_top"><img src="/Images/banner/ads300x250.gif" alt="ads300x250 جستجو با استفاده از وب سرویس گوگل   قسمت اول" border="0" title="جستجو با استفاده از وب سرویس گوگل   قسمت اول" /></a></TD></TR></TABLE> &#8211;><!-- Ads --></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;><strong>معرفی</strong></p>
<p>آیا می دانید گوگل  برای جستجو در دیتابیس خود، دریافت نسخه cache شده یک وب  سایت و همچنین استفاده از سرویس spelling check یک وب سرویس فراهم کرده است؟  استفاده از وب سرویس گوگل می تواند جستجوی گوگل را برای سایت شما فراهم کند. در  اولین بخش این مقاله، ما به چگونگی استفاده از این وب سرویس برای جستجو در دیتابیس  گوگل خواهیم پرداخت.</p>
<p><strong>API وب سرویس گوگل</strong></p>
<p>اطلاعات وب سرویس گوگل را می توانید در آدرس <a href="../../www.google.com/apis/default.htm" target="_blank">http://www.google.com/apis</a> پیدا کنید. برای شروع استفاده از وب  سرویس گوگل شما باید <a href="../../www.google.com/apis/download.html" target="_blank">Google Web API Developer&#8217;s Kit</a> را دانلود کنید. این فایل ۶۶۶  کیلو بایتی شامل فایل WSDL ( زبان توصیف وب سرویس) است که کاملا وب سرویس را توصیف  می کند و نیز مثال هایی جهت دسترسی به این وب سرویس با زبان های جاوا، ویژوال بیسیک  و سی شارپ دات نت دارد.</p>
<p>بعد از دانلود API Developer&#8217;s Kit، شما باید یک اکانت در گوگل بسازید، این کار  را می توانید از طریق آدرس زیر انجام دهید.<a href="../../https@www.google.com/accounts/newaccount@continue=http_3a_2f_2fapi.google.com_2fcreatekey&amp;followup=http_3a_2f_2fapi.google.com_2fcreatekey" target="_blank">https://www.google.com/accounts/NewAccount?continue=http://api.google.com/createkey</a> .<br />
بعد از اینکه یکی از این اکانت های مجانی را ساختید. شما باید یک کلید لایسنس  یکتا تعیین کنید. این کلید لایسنس باید هر دفعه که شما وب سرویس گوگل را فرامی  خوانید استفاده شود. هدف این مجوز، محدود کردن درخواست وب سرویس ها به ۱۰۰۰ عدد در  روز به ازای هر کلید لایسنس است.</p>
<p><strong>ساختن کلاس پراکسی</strong></p>
<p>بعد از اینکه کلید مجوز و کیت توسعه دهندگان را دریافت کردید، قدم بعدی ساخت یک  کلاس پراکسی برای فراخوانی وب سرویس است. برای انجام این کار ما ابتدا به دستکاری  در فایل WSDL نیاز داریم، این یک فایل به فرمت XML است که سرویس ارائه شده توسط وب  سرویس گوگل را توصیف می کند. این فایل WSDL ، GoogleSearch.wsdl در کیت توسعه  دهندگان مشخص شده است.</p>
<p>اگر از ویژوال استودیو دات نت استفاده می کنید، این فایل را در یک دایرکتوری  ASP.NET ( مثلا C:\Inetpub\wwwroot\WebApplication1 ) کپی کنید. سپس در ویژوال  استودیو به منوی Project بروید و گزینه Add Web Reference  را انتخاب کنید. سپس در  جعبه محاوره، آدرس فایل WSDL را وارد کنید، که چیزی شبیه به  http://localhost/WebApplication1/GoogleSearch.wsdl خواهد بود . برای تکمیل عملیات  روی دکمه Add Reference  کلیک کنید. این کار یک کلاس پراکسی  با استفاده از فضا نام  localhost می سازد ( که در صورت تمایل می توانید آن را تغییر دهید).</p>
<p>اگر ویژوال استودیو دات نت ندارید، می توانید از طریق برنامه خط فرمان به نام  wsdl.exe یک کلاس پراکسی بسازید. wsdl.exe یک فایل سی شارپ یا VB.NET می سازد که  شما پس از آن احتیاج به کامپایل خواهید داشت. برای اجرای wsdl.exe در خط فرمان  دستور زیر را وارد کنید:</p>
<p dir="rtl" align="center">
wsdl /protocol:SOAP /namespace:google  /out:GoogleProxy.cs C:\google\GoogleSearch.wsdl</p>
<p>این کار یک فایل سی شارپ به نام GoogleProxy.cs  با فضا نام google می سازد.  برای کامپایل این کلاس از کامپایلر خط فرمانی سی شارپ یعنی csc به صورت زیر استفاده  کنید:</p>
<p dir="rtl" align="center">csc /t:library /out:GoogleProxy.dll GoogleProxy.cs</p>
<p>این کار برای شما یک فایل به نام GoogleProxy.dll می سازد . مطمئن شوید که  یک کپی از این فایل در دایرکتوری bin برنامه وبی شما باشد!</p>
<p><strong>ساخت یک صفحه وبی ASP.NET برای فراخوانی وب سرویس گوگل</strong></p>
<p>حالا که کلاس پراکسی را ساخته ایم، فراخوانی وب سرویس گوگل از طریق یک صفحه وب  کار آسانی است. قبل از امتحان کردن این کار باید پارامترهایی که متدهای وب سرویس  انتظارشان را دارند بشناسیم. خوشبختانه این متدها و پارامترهای ورودی شان در <a href="../../www.google.com/apis/reference.html" target="_blank">بخش مرجع</a> در وب  سایت گوگل کاملا معرفی شده اند. چون در این مقاله ما روی استفاده از متدهای جستجو  تمرکز کرده ایم اجازه بدهید تا پارامتر های متد <a href="../../www.google.com/apis/reference.html#searchrequest" target="_blank">doGoogleSearch</a> را با هم بررسی کنیم. این متد ۱۰ پارامتر ورودی  دارد:</p>
<table id="Table2" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td width="99%" valign="top">
<div style="padding-right: 5px; padding-left: 5px;">
<div>
<table id="Table3" class="text" dir="rtl" border="1" cellspacing="0" cellpadding="3" width="90%">
<tbody>
<tr>
<td width="20%" valign="top">
<div><strong>نام</strong></div>
</td>
<td width="80%" valign="top">
<div><strong>توضیح</strong></div>
</td>
</tr>
<tr>
<td>
<div><strong>key</strong></div>
</td>
<td>بوسیله گوگل فراهم شده است، این کلید برای شما لازم است تا به سرویس وب گوگل  دسترسی داشته باشید، گوگل این کلید را برای احراز هویت و ثبت استفاده می  کند.</td>
</tr>
<tr>
<td>
<div><strong>q</strong></div>
</td>
<td>بخش <a href="../../www.google.com/apis/reference.html#2_2" target="_blank">اصطلاحات پرس و جو</a> را برای اطلاعات بیشتر در مورد گرامر کوئری  ببینید</td>
</tr>
<tr>
<td>
<div><strong>start</strong></div>
</td>
<td>یک شاخص Zero-based از اولین نتیاج دلخواه</td>
</tr>
<tr>
<td>
<div><strong>maxResults</strong></div>
</td>
<td>تعداد نتایج دلخواه برای هر پرس وجو، بیشترین مقدار برای هر پرس و جو ۱۰ تاست.  توجه : اگر شما پرس و جویی را انجام دهید که نتایج زیادی ندارد، مقدار واقعی نتایجی  که دریافت می کنید ممکن است کمتر از آن چیزی باشد که درخواست کرده  اید.</td>
</tr>
<tr>
<td>
<div><strong>filter</strong></div>
</td>
<td>فعال یا غیرفعال کردن فیلتراتوماتیک نتایج، که نتایج بسیار شبیه به هم یا  نتایجی که همگی از یک وب هوست آمده اند را مخفی می کند. برای اطلاعات بیشتر بخش <a href="../../www.google.com/apis/reference.html#2_3" target="_blank">فیلترینگ  اتوماتیک</a> را ببینید.</td>
</tr>
<tr>
<td>
<div><strong>restricts</strong></div>
</td>
<td>محدود کردن جستجو به یک زیر مجموعه شاخص های وب گوگل، به عنوان مثال محدود کردن  به کشوری مثل اوکراین یا موضوعی مثل لینوکس . برای اطلاعات بیشتر بخش <a href="../../www.google.com/apis/reference.html#2_4" target="_blank">محدود کردن</a> را ببینید.</td>
</tr>
<tr>
<td>
<div><strong>safeSearch</strong></div>
</td>
<td>یک مقدار بول که مشخص که فیلتر محتوای بالای ۱۸ سال را در نتایج جستجو فعال می  کند. بخش <a href="../../www.google.com/apis/reference.html#2_6" target="_blank">جستجوی امن</a> را برای کسب اطلاعات بیشتر ببینید.</td>
</tr>
<tr>
<td>
<div><strong>lr</strong></div>
</td>
<td><em>محدود کردن زبان &#8211; محدود کردن جستجو در میان اسناد یک یا چند زبان  خاص</em></td>
</tr>
<tr>
<td>
<div><strong>ie</strong></div>
</td>
<td><em>Input Encoding &#8211; </em> تمام درخواست ها به API باید بوسیله UTF-8 باشد. برای  اطلاعات بیشتر بخش<a href="../../www.google.com/apis/reference.html#2_5" target="_blank"> انکودینگ ورودی و خروجی</a> را ببینید.</td>
</tr>
<tr>
<td>
<div><strong>oe</strong></div>
</td>
<td><em>Output Encoding -</em> تمام درخواست ها به API باید بوسیله UTF-8 باشد. برای  اطلاعات بیشتر بخش<a href="../../www.google.com/apis/reference.html#2_5" target="_blank"> انکودینگ ورودی و خروجی</a> را  ببینید.</td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<p>متد doGoogleSearch نمونه ای از شی <a href="../../www.google.com/apis/reference.html#search_results_format" target="_blank">GoogleSearchResult</a> را برمی گرداند. این شی یک مشخصه به نام  resultElements دارد که آرایه ای از اشیا موسوم به ResultElement می باشد. شی  ResultElement تعدادی مشخصه دارد، مثل عنوان، آدرس، خلاصه و چیزهایی از این  دست.</p>
<p>حالا اجازه بدهید که یک صفحه ASP.NET ساده بسازیم تا ۱۰ نتیجه اول را برای پرس و  جوی عبارت &#8220;ASP&#8221; برگرداند. این کار را به کمک کد زیر می توان انجام داد:</p>
<div class="MultiLineCode">
<pre>&lt;script language="VB" runat="server"&gt;
  Sub Page_Load(sender as Object, e as EventArgs)
    <strong>Dim search As google.GoogleSearchService = New google.GoogleSearchService()
    Dim result as google.GoogleSearchResult

    result = search.doGoogleSearch("<em>license key...</em>", "ASP", _
                              0, 10, True, "", True, "", "", "")</strong>

    dlResults.DataSource = result.resultElements
    dlResults.DataBind()
  End Sub
&lt;/script&gt;

&lt;asp:DataList runat="server" id="dlResults"
      Font-Name="Verdana" Font-Size="10pt"&gt;
  &lt;ItemTemplate&gt;
    &lt;span style="font-size:15pt;font-weight:bold;"&gt;
      &lt;%# Container.DataItem.title %&gt;
    &lt;/span&gt;&lt;br /&gt;
    &lt;%# Container.DataItem.summary %&gt;&lt;br /&gt;
    [&lt;a href="&lt;%# Container.DataItem.URL %&gt;"&gt;
        &lt;%# Container.DataItem.URL %&gt;
     &lt;/a&gt;]
  &lt;/ItemTemplate&gt;

  &lt;SeparatorTemplate&gt;
    &lt;p&gt;آ &lt;/p&gt;
  &lt;/SeparatorTemplate&gt;
&lt;/asp:DataList&gt;</pre>
</div>
<p>در متن ضخیم (Bold) کد لازم برای فراخوانی متد doGoogleSearch در وب سرویس گوگل  نشان داده شده است. نتایج جستجو در یک دیتالیست به نمایش درخواهند آمد، به همراه هر  نتیجه، عنوان، خلاصه و آدرس دسترسی به آن صفحه نمایش داده می شود.</p>
<p>در قسمت دوم این مقاله خواهیم دید که چگونه یک صفحه ASP.NET مفیدتر که از وب  سرویس گوگل استفاده می کند بنویسیم.</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/usegooglewebservicep1871230-1695/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ایجاد یک الگوی سفارشی برای Web Formها</title>
		<link>http://www.irandevelopers.com/programming/customizewebformcsharp8712171812-1578/</link>
		<comments>http://www.irandevelopers.com/programming/customizewebformcsharp8712171812-1578/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 14:45:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1578</guid>
		<description><![CDATA[در بسیاری مواقع لازم است که سبک و شکلی یکسان در تمام صفحات یک سایت رعایت شود و همهچنین مواردی مانند تعریف Stylesheetهای استفاده شده نیز باید به تمام صفحات اضافه شوند. در این مقاله الگویی برای پروژه‌های #C خواهیم ساخت تا با استفاده از آن دیگر مجبور به نوشتن کدهای تکراری برای هر صفحه [...]]]></description>
			<content:encoded><![CDATA[<p>در بسیاری مواقع لازم است که سبک و شکلی یکسان در تمام صفحات یک سایت رعایت شود و  همهچنین مواردی مانند تعریف Stylesheetهای استفاده شده نیز باید به تمام صفحات  اضافه شوند. در این مقاله الگویی برای پروژه‌های #C خواهیم ساخت تا با استفاده از  آن دیگر مجبور به نوشتن کدهای تکراری برای هر صفحه نباشیم.</p>
<p>توجه: در تمام  مسیرهای استفاده شده در این مقاله بجای VSNET دایرکتوری محل نصب Visual Studio .NET  را مشخص کنید.</p>
<p>ابتدا با استفاده از Notepad فایل WebProjectItems.vsdir را  که در مسیر VSNET\VC#\CSharpProjectItems\WebProjectItems قرار دارد باز کنید و خط  زیر را به آن اضافه کنید:</p>
<div class="Code">..\MyCustomWebFormWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|My  Custom Form|10|#2263|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4534|0|WebForm.aspx</div>
<p>سپس به دایرکتوری VSNET\VC#\CSharpProjectItems رفته و فایل  CSharpAddWebFormWiz.vsz را کپی کرده و با نام MyCustomWebFormWiz.vsz ذخیره کنید.  با استفاده از Notepad آن را باز کنید و مقدار Param را بصورت زیر تغییر دهید:</p>
<div class="Code">Param=&#8221;WIZARD_NAME = MyCustomWebFormWiz&#8221;</div>
<p>اکنون به  دایرکتوری VSNET\VC#\VC#Wizards رفته و دایرکتوری CSharpAddWebFormWiz را کپی کرده  و به آن نام MyCustomWebFormWiz را بدهید. سپس فایل WebForm1.aspx را که در مسیر  VSNET\VC#\VC#Wizards\MyCustomWebFormWiz\Templates\1033 قرار دارد باز کنید و  تغییرات لازم را در آن داده و ذخیره کنید.</p>
<p>برای استفاده از این الگوی جدید  کافیست یک پروژه جدید وب در #C ایجاد کرده و Add Web Form را در منوی Project کلیک  کنید و سپس My Custom Form را انتخاب کنید.</p>
<p><img class="alignnone size-full wp-image-1579" title="33331" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/33331.jpg" alt="33331 ایجاد یک الگوی سفارشی برای Web Formها" width="280" height="230" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/customizewebformcsharp8712171812-1578/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ایجاد ارتباط TCP میان سرویس دهنده و سرویس گیرنده توسط #C</title>
		<link>http://www.irandevelopers.com/programming/tcpserverclinetappcsharp8711231426-1438/</link>
		<comments>http://www.irandevelopers.com/programming/tcpserverclinetappcsharp8711231426-1438/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 10:56:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1438</guid>
		<description><![CDATA[پروتکل Transmission Control Protocol) TCP) یک پروتکل جریان گرا، ارتباط گرا، قابل اعتماد و نظیر به نظیر می باشد. ارتباط TPC همانند ارتباط تلفنی می باشد. به عنوان مثال شما (سرویس گیرنده) به منزل دوست خود (سرویس دهنده) زنگ می زنید. در صورتیکه دوست شما در منزل باشد تلفن را برداشته و با یکدیگر شروع [...]]]></description>
			<content:encoded><![CDATA[<p dir="rtl" align="justify">
پروتکل Transmission Control Protocol) TCP) یک پروتکل جریان گرا، ارتباط گرا،  قابل اعتماد و نظیر به نظیر می باشد. ارتباط TPC همانند ارتباط تلفنی می باشد. به  عنوان مثال شما (سرویس گیرنده) به منزل دوست خود (سرویس دهنده) زنگ می زنید. در  صورتیکه دوست شما در منزل باشد تلفن را برداشته و با یکدیگر شروع به صحبت می کنید  (نظیر به نظیر، جریان گرا، قابل اعتماد) و در انتها شما و دوستتان گوشی تلفن را قطع  کرده (ارتباط گرا) و به ارتباط خود خاتمه می دهید. به عنوان مثال پروتکل HTTP از  TCP استفاده می کند.TCP از IP به عنوان پروتکل شبکه استفاده می کند. IP یک پروتکل  datagram (بسته های داده) گرا و Best-Effort (بسته های داده بصورتی فرستاده می شود  که تحویل و صحت آن تضمین نمی گردد) می باشد.</p>
<p dir="rtl" align="justify">در این مقاله یک مثال کوچک و ساده در مورد چگونگی برقراری  ارتباط بین سرویس دهنده و سرویس گیرنده مورد بررسی قرار می گیرد. این مثال از دو  بخش تشکیل شده است. بخش سرویس دهنده و بخش سرویس گیرنده.</p>
<p><strong>کلاسهای مورد  نیاز</strong></p>
<p dir="rtl" align="justify">در این مثال تنها دو کلاس اصلی بکار برده شده است. در سمت  سرویس گیرنده، از کلاس System.Net.Sockets.TcpClient و در سمت سرویس دهنده از کلاس  System.Net.Sockets.TcpListener استفاده می گردد. بطور کلی در سمت سرویس گیرنده یک  TcpClient به سرویس دهنده متصل می شود. سپس با یک کانالی (جریان) که به سرویس دهنده  اختصاص داده شده است اعمال مربوطه انجام می پذیرد.</p>
<table id="table1" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;"><span style="color: #008000;">// اتصال به سرویس دهنده  ۱۲۷٫۰٫۰٫۱:۸۰۸۰<br />
</span>TcpCleint client = <span style="color: #0000ff;">new</span> TcpClient(&#8220;127.0.0.1&#8243;, 8080);</p>
<p><span style="color: #008000;">// گرفتن کانال ارتباطی  برای ردوبدل کردن داده ها</span><br />
NetworkStream ns =  client.GetStream();</p>
<p><span style="color: #008000;">// قطع ارتباط با سرویس  دهنده</span><br />
client.Close();<br />
</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">سمت سرویس دهنده شامل مراحلی بیشتری می باشد، اما صورت  کلی کد به همان صورت کد سرویس گیرنده شبیه می باشد. ابتدا باید یک درگاه محلی را به  TcpListener اختصاص داد. در صورتیکه سرویس گیرنده به سرویس دهنده متصل شود به شما  یک socket برگردانده می شود. با استفاده از این socket شما می تواند یک کانال  ارتباطی (جریان) ایجاد نمایید.</p>
<table id="table2" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;"><span style="color: #008000;">// برروی پورت ۸۰۸۰  listener ایجاد یک<br />
</span>TcpListener listener = <span style="color: #0000ff;">new</span> TcpListener(8080);<br />
listener.Start();</p>
<p><span style="color: #008000;">// انتظار بمنظور دریافت درخواست از سمت سرویس  گیرنده</span><br />
Socket server = listener.AcceptSocket();</p>
<p><span style="color: #008000;">// ایجاد یک کانال برای ردوبدل کردن داده ها</span><br />
NetworkStream  ns = <span style="color: #0000ff;">new</span> NetworkStream(server);</p>
<p><span style="color: #008000;">// قطع ارتباط از سرویس  گیرنده<br />
</span>server.Close();<br />
</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
<strong>قالب دستورات</strong></p>
<p dir="rtl" align="justify">در این مثال دستورات با استفاده از &lt;CRLF&gt; (دستورات  با Enter از هم جدا می شوند) از یکدیگر تمیز داده می شوند. در صورتیکه سرویس گیرنده  دستور &#8220;GET&#8221; را اجرا نماید پیغام &#8220;Hello World&#8221; برای او ارسال شده و در صورت ارسال  دستور &#8220;EXIT&#8221; عبارت &#8220;BYE&#8221; برای سرویس گیرنده فرستاده شده و ارتباط قطع می  گردد.</p>
<p><strong>سرویس دهنده</strong></p>
<p dir="rtl" align="justify">در دنیای واقعی سرویس دهنده از دو قسمت اصلی تشکیل می  شود. قسمت Functional Layer و دیگری Commad Processor. قسمت پردازشگر دستورات واسطی  بین لایه ارتباطی و Functional Layer می باشد. لایه ارتباطی درخواست خود را به لایه  پردازشگر دستورات ارسال می کند این لایه درخواست را به لایه Functional ارسال کرده  و پس از دریافت جواب از لایه Functional آنرا به لایه ارتباطی می فرستد. سرویس  دهنده ها معمولا به صورت سرویس های سیستم عامل اجرا می شوند. در این مثال سرویس  دهنده ما تنها یک لایه داشته و به عنوان یک برنامه کنسول اجرا می گردد.</p>
<table id="table3" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;">Console.WriteLine(&#8220;Intitializing Server  &#8230;&#8221;);<br />
TcpListener listener = <span style="color: #0000ff;">new</span> TcpListener(8080);<br />
listener.Start();<br />
Console.WriteLine(&#8220;Server  initialized, waiting for incomming connections &#8230;&#8221;);</p>
<p>Socket s =  listener.AcceptSocket();<br />
<span style="color: #008000;">// ایجاد یک جریان برای ارتباط </span><br />
NetworkStream ns = <span style="color: #0000ff;">new</span> NetworkStream(s);<br />
StreamReader r = <span style="color: #0000ff;">new</span> StreamReader(ns);</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">listener برروی پورت ۸۰۸۰ آماده دریافت درخواست سرویس  گیرنده ها می باشد. متد AcceptSocket در زمان اتصال سرویس گیرنده یک socket را برمی  گرداند. این متد برنامه را تا زمان دریافت درخواست معلق می کند. در صورت نیاز می  توان از یک نخ برای این منظور استفاده نمود. در ادامه کانال ارتباطی لازمه برقرار  می گردد و از کلاس StreamReader بمنظور دریافت داده ها از این کانال استفاده می  شود. در این قسمت فرمانهای صادر شده از سوی سرویس دهنده باید بررسی و پاسخ مورد نظر  به آن داده شود.</p>
<table id="table4" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">bool</span> loop = <span style="color: #0000ff;">false</span>;<br />
<span style="color: #0000ff;">while</span> (!loop)<br />
{<br />
<span style="color: #008000;"> // خواندن یک خط کامل </span><br />
<span style="color: #0000ff;">string</span> command = r.ReadLine();<br />
<span style="color: #0000ff;">string</span> result;<br />
Console.WriteLine(&#8220;Executing remote  commad: &#8221; + command);<br />
switch (command)<br />
{<br />
<span style="color: #0000ff;">case</span> &#8220;GET&#8221;:<br />
result = &#8220;Hello World !&#8221;;<br />
<span style="color: #0000ff;">break</span>;<br />
<span style="color: #008000;">// خاتمه ارتباط</span><br />
<span style="color: #0000ff;">case</span> &#8220;EXIT&#8221;:<br />
result = &#8220;BYE&#8221;;<br />
loop = <span style="color: #0000ff;">true</span>;<br />
<span style="color: #0000ff;">break</span>;<br />
<span style="color: #008000;">// دستور نامعتبر</span><br />
<span style="color: #0000ff;">default</span>:<br />
result = &#8220;ERROR&#8221;;<br />
<span style="color: #0000ff;">break</span>;<br />
}<br />
<span style="color: #0000ff;">if</span> (result != <span style="color: #0000ff;">null</span>)<br />
{<br />
Console.WriteLine(&#8220;Sending result: &#8221; + result);<br />
<span style="color: #008000;">// به انتهای پیغام پیغام CRLF افزودن</span><br />
result +=  &#8220;\r\n&#8221;;<br />
<span style="color: #008000;">// تبدیل رشته به آرایه ای از  بایتها</span><br />
<span style="color: #0000ff;">Byte[]</span> res =  System.Text.Encoding.ASCII.GetBytes( &lt; BR &gt; result.ToCharArray());<br />
<span style="color: #008000;">// ارسال نتیجه به سرویس گیرنده</span><br />
s.Send(res, res.Length, 0);<br />
}<br />
}<br />
</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
در صورتیکه دستور GET در یافت شود سرویس دهنده پیغام  Hello World را صادر کرده و ادامه دستورات پردازش می گردد. در صورت صدور دستور  ناشناخته نیز پردازش دستورات ادامه می یابد. در صورت دریافت دستور EXIT پردازش  دستورات خاتمه یافته و در ادامه ارتباط با سرویس گیرنده قطع می شود.</p>
<table id="table5" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;">Console.WriteLine(&#8220;Clearing up server &#8230;&#8221;);<br />
s.Close();<br />
Console.Write(&#8220;Press return to exit&#8221;);<br />
Console.ReadLine();</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
<strong>سرویس گیرنده</strong></p>
<p dir="rtl" align="justify">سرویس گیرنده تا حدودی از سرویس دهنده پیچیده تر می باشد.  سرویس گیرنده شامل دو قسمت می باشد: واسط کاربر (که یک برنامه کنسول ساده است) و  پردازشگر دستورات که شامل عناصر ارتباطی می باشد. در ابتدا پردازشگر دستورات مورد  بررسی قرار می گیرد. برای اینکار ابتدا یک interface ایجاد می کنیم. استفاده از  interface قابلیت انعطاف پذیری بیشتری در مورد استفاده از پروتکل های دیگر به شما  می دهد. در این حالت سرویس گیرنده تنها اشیاعی را می پذیرد که واسط مورد نظر را  پیاده سازی کرده باشند. این عمل باعث استقلال سرویس گیرنده از پروتکل ارتباطی می  گردد.</p>
<table id="table6" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">interface</span> CommandProcessor<br />
{<br />
<span style="color: #008000;">// یک دستور را اجرا کرده و حاصل را برمی گرداند<br />
// باشد  پردازش دستورات باید متوقف گردد false در صورتیکه خروجی آن<br />
</span><span style="color: #0000ff;"> bool</span> Execute(<span style="color: #0000ff;">string</span> command,  <span style="color: #0000ff;">ref string</span> result);<br />
}</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
در ادامه یک کلاس با نام TCPClientCommandProcessor  ایجاد می گردد. این کلاس واسط CommadProcessor را پیاده سازی می نماید. این کلاس  شامل ۳ متد و یک سازنده می باشد. متد Connect وظیفه اتصال بر سرویس دهنده را برعهده  دارد. بوسیله متد DisConnect ارتباط با سرویس دهنده قطع گشته و با متد Execute  فرمانهای مورد نظر به سرویس دهنده ارسال می گردد.</p>
<p dir="rtl" align="justify">
<table id="table7" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">public class</span> TCPClientCommandProcessor : CommandProcessor<br />
{<br />
<span style="color: #008000;">// آدرس سرویس دهنده</span><br />
<span style="color: #0000ff;">string</span> host = <span style="color: #0000ff;">null</span>;<br />
<span style="color: #008000;">// پورت سرویس دهنده</span><br />
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> port = -1;<br />
<span style="color: #008000;">// واسط ارتباطی</span><br />
<span style="color: #0000ff;">private</span> TcpClient client = <span style="color: #0000ff;">null</span>;<br />
<span style="color: #008000;">// جریان خروجی داده</span><br />
<span style="color: #0000ff;">private</span> NetworkStream outStream = <span style="color: #0000ff;">null</span>;<br />
<span style="color: #008000;">// جریان ورودی  داده</span><br />
<span style="color: #0000ff;">private</span> StreamReader inStream =  <span style="color: #0000ff;">null</span>;</p>
<p><span style="color: #0000ff;">public</span> TCPClientCommandProcessor(<span style="color: #0000ff;">string</span> host, <span style="color: #0000ff;">int</span> port)<br />
{<br />
<span style="color: #0000ff;">this</span>.host = host;<br />
<span style="color: #0000ff;">this</span>.port = port;<br />
<span style="color: #0000ff;">this</span>.Connect();<br />
}</p>
<p><span style="color: #008000;">// اتصال به سرویس دهنده</span><br />
<span style="color: #0000ff;">public  void</span> Connect()<br />
{<br />
Console.WriteLine(String.Format(&#8220;Connecting to {0}:{1} &#8230;&#8221;,<br />
<span style="color: #0000ff;">this</span>.host, <span style="color: #0000ff;">this</span>.port) );<br />
<span style="color: #0000ff;">this</span>.client = <span style="color: #0000ff;">new</span> TcpClient(<span style="color: #0000ff;">this</span>.host, <span style="color: #0000ff;">this</span>.port);<br />
<span style="color: #0000ff;">this</span>.outStream = <span style="color: #0000ff;">this</span>.client.GetStream();<br />
<span style="color: #0000ff;">this</span>.inStream = <span style="color: #0000ff;">new</span> StreamReader(<span style="color: #0000ff;">this</span>.outStream);<br />
Console.WriteLine(String.Format(&#8220;Connected to {0}:{1}&#8221;,<br />
<span style="color: #0000ff;">this</span>.host, <span style="color: #0000ff;">this</span>.port) );<br />
}</p>
<p><span style="color: #008000;">// قطع ارتباط با سرویس دهنده</span><br />
<span style="color: #0000ff;">public void</span> DisConnect()<br />
{<br />
<span style="color: #0000ff;">if</span> (this.client != <span style="color: #0000ff;">null</span>)<br />
{<br />
this.client.Close();<br />
Console.WriteLine(String.Format(&#8220;Connection closed: {0}:{1}&#8221;,<br />
<span style="color: #0000ff;">this</span>.host, <span style="color: #0000ff;">this</span>.port) );<br />
}<br />
}</p>
<p><span style="color: #008000;">// اجرای  دستورات</span><br />
<span style="color: #0000ff;">public bool</span> Execute(<span style="color: #0000ff;">string</span> command, <span style="color: #0000ff;">ref string</span> result)<br />
{<br />
<span style="color: #0000ff;">bool</span> ret = <span style="color: #0000ff;">true</span>;<br />
command += &#8220;\r\n&#8221;;<br />
<span style="color: #0000ff;">Byte[]</span> cmd = System.Text.Encoding.ASCII.GetBytes(<br />
command.ToCharArray() );<br />
<span style="color: #008000;">// ارسال  درخواست</span><br />
this.outStream.Write(cmd, 0, cmd.Length);<br />
<span style="color: #008000;">// دریافت پیام </span><br />
result =  this.inStream.ReadLine();<br />
ret = !result.Equals(&#8220;BYE&#8221;);<br />
<span style="color: #0000ff;">return</span> ret;<br />
}<br />
}</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
<strong>واسط کاربر سرویس گیرنده</strong></p>
<p dir="rtl" align="justify">واسط کاربر سرویس گیرنده یک برنامه کنسول ساده می باشد.  در این برنامه یک شئ از کلاس TCPClientCommandProcessor ایجاد شده و اعمال مربوطه  انجام می گردد.</p>
<table id="table8" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#f7f7f7">
<tbody>
<tr>
<td><span style="font-family: Courier New; font-size: x-small;">Console.WriteLine(&#8220;Initializing client  &#8230;&#8221;);<br />
TCPClientCommandProcessor proc = new<br />
TCPClientCommandProcessor(&#8220;127.0.0.1&#8243;, 8080);</p>
<p><span style="color: #0000ff;">string</span> result = &#8220;&#8221;;<br />
<span style="color: #0000ff;">string</span> cmd = <span style="color: #0000ff;">null</span>;<br />
while (!result.Equals(&#8220;BYE&#8221;))<br />
{<br />
Console.Write(&#8220;Command : &#8220;);<br />
cmd = Console.ReadLine();<br />
proc.Execute(cmd, ref result);<br />
Console.WriteLine(result);<br />
}</p>
<p>Console.WriteLine(&#8220;Closing connection&#8230;&#8221;);<br />
proc.DisConnect();<br />
Console.Write(&#8220;Press return to exit&#8221;);<br />
Console.ReadLine();<br />
</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
برگرفته ار کتاب C#.NET Web Developer&#8217;s Guide  انتشارات SYNGRESS</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/tcpserverclinetappcsharp8711231426-1438/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>بررسی نحوه ذخیره سازی Resource ها در اسمبلی های .NET</title>
		<link>http://www.irandevelopers.com/programming/resourceassemblydotnet8711201034-1396/</link>
		<comments>http://www.irandevelopers.com/programming/resourceassemblydotnet8711201034-1396/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 07:05:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1396</guid>
		<description><![CDATA[.net Assembly توانائی ذخیره سازی منابع اضافه شده به برنامه ها ، از قبیل اطلاعات متنی و تصاویر مورد نیاز برنامه را دارد . در حالت عادی ما به تصاویر یا متن های مورد نیازمان از طریق فایل های روی هارد دیسک دسترسی داریم ، اما گاهی اوقات نیاز دارید که برنامه از منابع خارجی [...]]]></description>
			<content:encoded><![CDATA[<p dir="rtl" align="justify">
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl"><span style="font-family: Tahoma; font-size: x-small;"><span dir="ltr">.net Assembly</span> توانائی ذخیره سازی منابع  اضافه شده به برنامه ها ، از قبیل اطلاعات متنی و تصاویر مورد نیاز برنامه را دارد  .</span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl"><span style="font-family: Tahoma; font-size: x-small;">در حالت عادی ما به تصاویر یا متن های مورد نیازمان از طریق  فایل های روی هارد دیسک دسترسی داریم ، اما گاهی اوقات نیاز دارید که برنامه از  منابع خارجی که درون خودش ذخیره کرده استفاده کند. در این صورت شما هنگام توزیع  برنامه دیگر نگرانی درباره مسیر فایل های مورد نیاز آن که هنگام نصب برنامه از  کاربر درخواست می شود را ندارید.</span></p>
<p>حال طریقه استفاده از <span dir="ltr">.net  Assembly</span> را شرح می دهیم:</p>
<p>ابتدا مراحل زیر را صورت دهید.<br />
۱- یک  پروژه جدید ایجاد کنید.<br />
۲- در Solution Explorer بر روی نام پروژه کلیک راست  کرده و سپس روی گزینه Add Existing Item کلیک کنید.<br />
۳- در پنجره Open نوع فایل  را به All Files تغییر دهید.<br />
۴- پس از انتخاب فایل ها روی آنها کلیک راست کرده و  Properties را انتخاب کنید.<br />
همانطور که می بینید مقدار اولیه خصوصیت Build  Action مربوط به فایل ، Content میباشد که باید به Embedded Resource تغییر  کند.</p>
<p>حال فایل های انتخابی شما بخشی از <span dir="ltr">.Net Assembly</span> هستند.</p>
<p>فراخوانی و نحوه استفاده از فایل های اضافه شده :<br />
فرض می کنیم که  شما یک تصویر با نام ۱٫bmp و یک فایل متنی با نام Test.txt را به برنامه وارد کرده  اید.ما این دو فایل را در رویداد Form_Load فراخوانی و نمایش می دهیم.</p>
<p>ابتدا  System.IO را در برنامه Import کنید:</p>
<table id="table10" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">Imports System.IO</span></p>
<p><span style="color: #0000ff;">Private</span> <span style="color: #0000ff;">Sub</span> Form1_Load(<span style="color: #0000ff;">ByVal</span> sender  <span style="color: #0000ff;">As</span> Object, <span style="color: #0000ff;">ByVal</span> e <span style="color: #0000ff;">As</span> System.EventArgs) <span style="color: #0000ff;">Handles</span> MyBase.Load<br />
<span style="color: #008000;"> &#8216;Assembly تعریف متغیری از نوع<br />
</span><span style="color: #0000ff;">Dim</span> asm <span style="color: #0000ff;">As</span> System.Reflection.Assembly = _<br />
<span style="color: #0000ff;">Me</span>.GetType.Assembly.GetEntryAssembly</p>
<p><span style="color: #0000ff;">Dim</span> my_namespace <span style="color: #0000ff;">As</span> String =  _<br />
asm.GetName().Name.ToString<br />
<span style="color: #008000;"> &#8216;String به  متغیری از نوع Assemblyنسبت دادن نام<br />
</span><br />
<span style="color: #0000ff;">Dim</span> pic_stream <span style="color: #0000ff;">As</span> Stream<br />
<span style="color: #0000ff;">Dim</span> bt <span style="color: #0000ff;">As</span> Bitmap</p>
<p>pic_stream = _<br />
asm.GetManifestResourceStream(my_namespace + &#8220;.1.bmp&#8221;)</p>
<p><span style="color: #0000ff;">If Not</span> pic_stream <span style="color: #0000ff;">Is Nothing  Then</span><br />
bt = <span style="color: #0000ff;">New</span> Bitmap(pic_stream)</p>
<p><span style="color: #0000ff;">Dim</span> pbox <span style="color: #0000ff;">As New</span> PictureBox()<br />
<span style="color: #008000;">&#8216;به آن  Image و نسبت دادن PictureBox<span lang="fa"> </span>ساخت<br />
</span> <span style="color: #0000ff;">With</span> pbox<br />
.Image = bt<br />
.Left =  600<br />
.Top = 200<br />
.Width = 200<br />
.Height =  200<br />
.Visible = True<br />
End With</p>
<p><span style="color: #0000ff;">Me</span>.Controls.Add(pbox)<br />
pic_stream.Close()<br />
<span style="color: #0000ff;"> End If</span></p>
<p><span style="color: #0000ff;">Dim</span> text_stream <span style="color: #0000ff;">As</span> Stream = _<br />
asm.GetManifestResourceStream(my_namespace _<br />
+  &#8220;.test.txt&#8221;)</p>
<p><span style="color: #0000ff;">If Not</span> (text_stream <span style="color: #0000ff;">Is Nothing</span>) <span style="color: #0000ff;">Then</span><br />
<span style="color: #0000ff;">Dim</span> stream_reader <span style="color: #0000ff;">As New</span> StreamReader(text_stream)</p>
<p><span style="color: #0000ff;">Dim</span> lbl  <span style="color: #0000ff;">As New</span> Label()<br />
<span style="color: #008000;"> &#8216;در آن  Test.txt و قرار دادن محتویات فایل Lable ساخت<span lang="fa"> </span>یک<span lang="fa"> </span><br />
</span> <span style="color: #0000ff;">With</span> lbl<br />
.Text = stream_reader.ReadToEnd()<br />
.Top =  75<br />
.Left = 5<br />
.Width = 500<br />
.Height =  500<br />
.Visible = True<br />
<span style="color: #0000ff;">End  With</span></p>
<p><span style="color: #0000ff;">Me</span>.Controls.Add(lbl)<br />
stream_reader.Close()<br />
<span style="color: #0000ff;">End If<br />
End  Sub</span></td>
</tr>
</tbody>
</table>
<p dir="rtl" align="justify">
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/resourceassemblydotnet8711201034-1396/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>چگونه می توان مقدار موجود در بانک اطلاعاتی را به یک DropDownList نسبت داد ؟</title>
		<link>http://www.irandevelopers.com/programming/dropdownlistdatabase8711201016-1392/</link>
		<comments>http://www.irandevelopers.com/programming/dropdownlistdatabase8711201016-1392/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 06:46:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[سی شارپ]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1392</guid>
		<description><![CDATA[آیا تا به حال شده که برای نسبت دادن مقادیر به یک DropDownList در فرم های Edit خود به مشکل بر بخورید ! فرض کنید یک dropdownlist بر روی صفحه Design Form خود دارید یا نام Drd1 حال می خواهید مقداری را که در بانک اطلاعاتی ذخیره شده به این DropDownlist نسبت یدهید و گزینه [...]]]></description>
			<content:encoded><![CDATA[<div id="panelArticle">
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl"><span style="font-family: Tahoma; font-size: x-small;"><br />
آیا تا به حال شده که برای نسبت دادن مقادیر به یک DropDownList در فرم های  Edit خود به مشکل بر بخورید !</p>
<p>فرض کنید یک dropdownlist بر روی صفحه Design  Form خود دارید یا نام Drd1 حال می خواهید مقداری را که در بانک اطلاعاتی ذخیره شده  به این DropDownlist نسبت یدهید و گزینه مربوط را select کنید  .<br />
</span></p>
<p><span dir="ltr"></p>
<table id="table11" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">&lt;asp:DropDownList id=&#8221;drd1&#8243; runat=server&gt;<br />
&lt;asp:ListItem  Value=&#8221;M&#8221;&gt;Male&lt;/asp:ListItem&gt;<br />
&lt;asp:ListItem  Value=&#8221;F&#8221;&gt;Female&lt;/asp:ListItem&gt;<br />
&lt;/asp:DropDownList&gt;</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl"><span style="font-family: Tahoma; font-size: x-small;">در قسمت Code Behind :</p>
<p>Databasevalue مقداری هست که شما  از بانک اطلاعاتی گرفته اید.</span></p>
<p><span dir="ltr"></p>
<table id="table12" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">Select Case</span> databasevalue<br />
<span style="color: #0000ff;">Case</span> &#8220;M&#8221;<br />
Drd1.Items.FindByValue(&#8220;M&#8221;).Selected =  <span style="color: #0000ff;">True</span><br />
<span style="color: #0000ff;">Case</span> &#8220;F&#8221;<br />
Drd1.Items.FindByValue(&#8220;F&#8221;).Selected = <span style="color: #0000ff;">True</span><br />
<span style="color: #0000ff;">End  Select</span></span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl"><span style="font-family: Tahoma; font-size: x-small;">اگر خواستید که Select کردن بر اساس Name صورت بگیرد اینگونه می  نویسید .</span></p>
<p><span dir="ltr"></p>
<table id="table13" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">Select Case</span> databasevalue<br />
<span style="color: #0000ff;">Case</span> &#8220;M&#8221;<br />
Drd1.Items.FindByName(&#8220;Male&#8221;).Selected  = <span style="color: #0000ff;">True</span><br />
<span style="color: #0000ff;">Case</span> &#8220;F&#8221;<br />
Drd1.Items.FindByName(&#8220;Female&#8221;).Selected = <span style="color: #0000ff;">True</span><br />
<span style="color: #0000ff;">End  Select</span></span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p dir="rtl" align="justify">
</div>
<p dir="rtl" align="right">
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/dropdownlistdatabase8711201016-1392/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

