ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل بیست و نهم برنامه نویسی Com و NET در #C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink {mso-style-unhide:no; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

فصل بیست و نهم

 C#درCom و NET برنامه نویسی

اگر ما همه کدهای نوشته شده تا به حال را رها کرده و از ابتدا شروع کنیم، خوب به نظر می رسد. اما این عمل، یک گزینهی

قابل قبول برای بیشتر شرک تها نیست. در گذشته بیشتر سازمان های توسعهدهنده، یک سرمایه گذاری قابل توجهی در

انجام داده بودند. مایکروسافت یک کمیته تضمین قابلیت استفادهی ActiveX و کنتر لهای Com توسعه و خرید قطعات

به آسانی قابل فراخوانی هستند. Com از طریق ،.NET را ایجاد کرده است و قطعات NET. مجدد این قطعات در

به .NET به برنامه، آشکار کردن 1 کلاس های Com و قطعات ActiveX برای وارد کردن کنترل های NET. این فصل پشتیبانی

را تشریح می کند. API 32Win و فراخوانی مستقیم Com برنامه های کاربردی بر پایه

ActiveX -1-29 وارد کردن 2 کنترل های

هستند، که روی فرم قرار داده م یشوند و ممکن است یک واسط کاربر داشته Com قطعات ActiveX کنترل های

را توسعه داد، توسعهدهندگان اجازه یافتند کنترل های OCX باشند یا نداشته باشند. زمانی که مایکروسافت استاندارد

شروع شد. در طول ActiveX آنها را بکار گیرند. از این زمان بود که انقلاب کنترل ++C ایجاد کرده و در VB را در ActiveX

ها، قطعه کدهای ActiveX . توسعه داده شدهاند و مورد استفاده قرار گرفتهاند ActiveX چند سال گذشته، هزاران کنترل

استفادهی مجدد کدهای باینری می باشند. ،ActiveX کوچک هستند که کار کردن با آنها راحت است. یک مثال کارا از

را به طور خودکار ActiveX 2005 قادر است کنترل های VS . بسیار آسان است .NET در ActiveX وارد کردن کنترل های

توسعه داده شده است که اسمبلی های ضروری کنترل AxImp 2005 یک نرم افزار کمکی به نام VS وارد کند. در خط فرمان

ایجاد میکند. NET. مورد نظر را در

خود وارد خواهید Form Windows زمانی که کنترلی در محیط ویندوز استاندارد کار میکند، شما آن را به برنامهی کاربردی

را انتخاب کنید. فرم پروژه را تا ActiveX Control 6 را باز کرده و در نوع پروژه جدید VB ، کرد. برای ایجاد کنترل جدید

کلیک راست کرده و User Control حد امکان کوچک کنید، چون این کنترل واسط کاربر نخواهد داشت. روی

کلیک Project روی Project Explorer تغییر دهید. در Calculator را انتخاب کنید. نام آن را به Properties

تغییر نام دهید. فوراً پروژه را ذخیره کرده و فایل و پروژه را CalcControl آن را به ،Properties کرده و در پنجره

1 نمایش داده شده است: - نامگذاری کنید. همانطور که در شکل 29 CalcControl

1 Exposing

2 Import

COM و NET. فصل بیست و نهم برنامه نویسی

547

1- شکل 29

1- در مثال 29 VB اضافه کنید. کد مورد نظر Code View حال م یتوانید 4 تابع محاسباتی را، در پنجره کد از طریق انتخاب

نشان داده شده است:

1- مثال 29

Public Function _

Add(left As Double, right As Double) _

As Double

Add = left + right

End Function

Public Function _

Subtract(left As Double, right As Double) _

As Double

Subtract = left - right

End Function

Public Function _

Multiply(left As Double, right As Double) _

As Double

Multiply = left * right

End Function

Public Function _

Divide(left As Double, right As Double) _

As Double

Divide = left / right

End Function

را اجرا کنید، تا این کد کامپایل Make CalcControl.ocx گزینهی ،File این قطعه کد، کد کامل کنترل است. از منوی

تعیین و CalcTest و نام پروژه را TestForm 6 بسازید. نام فرم را VB شود. در قدم بعدی یک پروژه استاندارد اجرائی در

آنها را ذخیره کنید.

از فرم ظاهر شده، به برنامهی CalcControl و انتخاب Ctrl+T را به عنوان یک قطعه به وسیله فشردن ActiveX کنترل

2 نشان داده شده است.) - خود اضافه کنید (چنانچه در شکل 29

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

548

2- شکل 29

3 میبینید - این عمل باعث میشود تا یک کنترل روی جعبه ابزار قرار گیرد. چنان که در شکل 29

3- شکل 29

بنامید. توجه داشته باشید که کنترل جدید CalcControl اضافه کنید و آن را TestForm کنترل جدید را بر روی فرم

قابل رویت نیست. این کنترل هیچ رایط کاربری ندارد. چهار دکمه و دو کادر متنی و یک برچسب به فرم اضافه کنید. چنانچه

4 نشان داده شده است: - در شکل 29

4- شکل 29

2 کد کامل - مثال 29 .btnAdd, btnSubtract, btnMultiply, btnDivide: اسامی دکمهها را چنین انتخاب کنید

این برنامه را نشان میدهد.

هرگاه که روی یکی از این دکمهها کلیک کنید، از شما دو عدد خواسته میشود، که باید در کادرهای متنی وارد کنید و نتیجه

در بر چسبها نشان داده میشود.

2- مثال 29

Private Sub btnAdd_Click()

Label١.Caption = _

calcControl.Add(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

Private Sub btnDivide_Click( )

Label١.Caption = _

calcControl.Divide(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

Private Sub btnMultiply_Click( )

Label١.Caption = _

COM و NET. فصل بیست و نهم برنامه نویسی

549

calcControl.Multiply(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

Private Sub btnSubtract_Click( )

Label١.Caption = _

calcControl.Subtract(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

NET. -2-29 واردکردن یک کنترل به

6 استفاده کرده تا مطمئن VB باید درست کار کند. می توانید این کنترل را در CalcControl توجه داشته باشید که کنترل

کپی کنید. بعد از کپی کردن، لازم است فایل NET. را به محیط توسعهی CalcControl.ocx شوید. میتوانید فایل

در برنامهی CalcControl 132 ثبت کنیم. حال میتوانید از کنترل Regsvr را از طریق برنامهی CalcControl.ocx

خود استفاده کنید: .NET

regsvr32 CalcControl.ocx

نامگذاری کنید، و فرم خود را InteropTest 2005 ایجاد کنید. آن برنامه را VS در #VC برای شروع کار، یک برنامه ویندوز

نامگذاری کنید. TestForm 5 طراحی کنید. فرم خود را - با کشیدن کنترل ها روی آن به صورت شکل 29

5- شکل 29

-1 وارد کردن یک کنترل -2-29

2005 را به کار برید، VS 2005 وجود دارد: می توانید ابزار محیط VS به محیط توسعه ActiveX دو روش برای واردکردن کنترل

2005 از منوی VS به صورت دستی کنترل را وارد کنید. برای استفادهی NET SDK. در aximp یا اینکه با استفاده از نر مافزار

شی Com Components را انتخاب کنید. در برگهی Choose ToolBox Items ،Tools

6 نمایش داده شده است. - را پیدا کنید. همانطور که در شکل 29 CalcControl.Calculator

1 C:\WINDOWS\system32

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

550

6- شکل 29

را اجرا کرده و Choose ToolBox Tools 2005 از منوی VS شما ثبت هست، در NET. روی سیستم CalcControl چون

2005VS . کنترل خود را پیدا کنید. زمانی که کنترل از کادر محاور های انتخاب م یشود، به برنامه کاربردی شما وارد م یشود

جزئیات کار، همچون اضافه کردن آن کنترل به نوار ابزار را انجام م یدهد.

-2 وارد کردن کنترل به صورت دستی -2-29

کنترل را به صورت دستی وارد کنید. ،aximp.exe می توانید یک کادر فرمان باز کرده و با استفاده از نر مافزار کمکی

7 میبینید. - همانطور که در شکل 29

7- شکل 29

مورد نظر را به عنوان آرگومان خود گرفته و سه فایل زیر را تولید میکند: ActiveX یک کنترل ،aximp.exe

NET. یک کنترل ویندوز تحت : AxCalcControl.dll •

.NET یک کتابخانه کلاس : CalcControl.dll •

یک فایل اشکال زدایی : AxCalcControl.pdb •

را NET FrameWork Components. برگشته و Choose ToolBox Items بعد از انجام این کار م یتوانید به پنجرهی

قرار گرفته را جستجو کرده و فایل را NET. تحت Axcalccontrol.dll انتخاب کنید. حال میتوانید مسیری را که کنترل

8 می بینید. - به داخل کادر ابزار وارد کنید. همانطور که در شکل 29

COM و NET. فصل بیست و نهم برنامه نویسی

551

8- شکل 29

-3 اضافهکردن کنترل به فرم -2-29

9 ظاهر می گردد. توجه داشته باشید که ممکن - زمانی که کنترل وارد میشود، کنترل روی منوی کادر ابزار، همانند شکل 29

است کنترل در پایین کادر ابزار، نیز ظاهر گردد.

9- شکل 29

6 این کار را انجام دادید. VB حال می توانید این کنترل را روی فرم کشیده و توابع آن را بکار برید، همانطور که در مثال

3 نمایش داده شده - ادارهکننده های رویداد را برای هر دکمه بیافزائید. کد منبع برای ادارهکننده های رویداد در مثال 29

است.

3- مثال 29

private void btnAdd_Click(object sender, System.EventArgs e)

{

double left = double.Parse(textBox١.Text);

double right = double.Parse(textBox٢.Text);

label١.Text = axCalculator١.Add( ref left, ref right).ToString( );

}

private void btnDivide_Click(object sender, System.EventArgs e)

{

double left = double.Parse(textBox١.Text);

double right = double.Parse(textBox٢.Text);

label١.Text = axCalculator١.Divide(ref left, ref right).ToString( );

}

private void btnMultiply_Click(object sender, System.EventArgs e)

{

double left = double.Parse(textBox١.Text);

double right = double.Parse(textBox٢.Text);

label١.Text = axCalculator١.Multiply(ref left, ref right).ToString( );

}

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

552

private void btnSubtract_Click(object sender, System.EventArgs e)

{

double left = double.Parse(textBox١.Text);

double right = double.Parse(textBox٢.Text);

label١.Text = axCalculator١.Subtract(ref left, ref right).ToString( );

}

به نوع Double.Parse هر متغیر، مقادیر مورد نیازش را از فیلدهای متنی 1 بدست می آورد، و با استفاده از متد ایستای

مضاعف 2 تبدیل می کند و آن مقادیر را به متدهای ماشین حساب رد می کند. نتایج بازگشتی به رشته تبدیل شده و در

10 می بینید. - برچسب 3 درج م یشوند. همانطور که در شکل 29

10- شکل 29

Com -3-29 وارد کردن قطعات

تولید شده توسط شرک تها Com میتوانند نسبتاً سر راست باشند. بیشتر قطعات ActiveX وارد کردن کنترل های

هستند. برای اینکه بفهمید چگونه از این فایلها به همراه COM DLL نیستند، هر چند آنها فای لهای استاندارد ActiveX

ایجاد کنید که دقیقاً شبیه قطعه قبلی کار کند. COM 6 برگشته و یک شی تجاری VB استفاده کنید، به NET.

6 است. نام VB استاندارد در COM DLL است. این مراحل ساخت یک ActiveX DLL گام اول ایجاد یک پروژهی جدید

4، در - قرار دهید. فایل و پروژه را ذخیره کنید. متدها را از مثال 29 ComCalculater و نام پروژه را ComCalc کلاس را

پنجره کد کپی کنید.

22- مثال 4

Public Function _

Add(left As Double, right As Double) _

As Double

Add = left + right

End Function

Public Function _

Subtract(left As Double, right As Double) _

As Double

Subtract = left - right

End Function

Public Function _

Multiply(left As Double, right As Double) _

As Double

Multiply = left * right

End Function

Public Function _

Divide(left As Double, right As Double) _

As Double

1 Textbox

2 Double

3 Label

COM و NET. فصل بیست و نهم برنامه نویسی

553

Divide = left / right

End Function

را اجرا کنید. برای تست این، به بر نامهی اخیر Make ComCalculator.dll DLL گزینهی File با استفاده از منوی

Project جدید را، به وسیلهی باز کردن پنجرهی DLL . را از فرم کنترل حذف کنید Calculator برگشته و

11 نشان داده شده است. - به برنامه اضافه کنید. چنانچه در شکل 29 ،ComCalculator و یافتن ،Refrences

11- شکل 29

ComTestForm -1 کدنویسی برنامهی -3-29

ایجاد کرده و متدهای آن را Comcalc خیلی شبیه اولین مثال است. در اینجا، یک نمونه از شی Com کد تمرین قطعه

5 را مشاهده کنید. - فراخوانی کنید. مثال 29

5- مثال 29

Private Sub btnAdd_Click()

Dim theCalc As New ComCalc

Label١.Caption = _

theCalc.Add(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

Private Sub btnDivide_Click( )

Dim theCalc As New ComCalc

Label١.Caption = _

theCalc.Divide(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

Private Sub btnMultiply_Click( )

Dim theCalc As New ComCalc

Label١.Caption = _

theCalc.Multiply(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

Private Sub btnSubtract_Click( )

Dim theCalc As New ComCalc

Label١.Caption = _

theCalc.Subtract(CDbl(Text١.Text), _

CDbl(Text٢.Text))

End Sub

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

554

NET. به COM DLL -2 وارد کردن -3-29

وارد کنید. قبل از وارد کردن آن، باید یکی از NET. کار میکردید که قادر بودید آن را به ComCalc DLL تا به حال شما با

موارد مقید کردن دیرهنگام و زودهنگام را انتخاب کنید. زمانی که سرویسگیرنده یک متد را از سرویسدهنده فراخوانی

می کند، باید مسئله آدرس متد روی حافظهی سرویس دهنده حل شود. این پروسه، مقید کردن خوانده می شود. در مقید

کردن زودهنگام، تحلیل آدرس یک متد روی سرویسدهنده، زمان کامپایل پروژه در سرویسگیرنده اتفاق می افتد و

سرویسگیرنده اضافه میشود. در مقید کردن دیرهنگام، تحلیل در زمان ارجاع رخ می دهد، زمانی NET. فراداده ها به ماژول

سرور را برای آن متد کاوش میکند. COM که

مقید کردن زودهنگام مزایای زیادی دارد. مهمترین آنها بهره وری است. متدهای مقید شده زودهنگام نسبت به متدهای مقید

را بازرسی کند. در هنگام Com شده دیرهنگام، سریع احضار م یشوند. برای انجام مقیدکردن زود هنگام، کامپایلر باید شی

وارد شود. NET بازرسی باید ابتدا کتابخانه مورد نظر به

-3 وارد کردن کتابخانه نوع داده -3-29

قابل استفاده NET با Com یک کتابخانهی نوع داده همراه خود دارد. اما فرمت یک کتابخانه نوع ،VB تولید شده با 6 Com Dll

را به یک اسمبلی وارد کنی د . با دو روش م ی توان این کار را انجام دا د . در Com نیست. برای حل این مش ک ل باید کتابخانه نوع

با رجیستر کردن قطعه م ی توانید آن را به اسمبلی وارد کنی د . همانطور که در بخش زیر نشان داده م ی شود یا با استفاده IDE

تولید interop یک اسمبلی Tlbimp.exe . کتابخان ه ی نوع داده را به صورت دستی وارد کنی د ، Tlbimp.exe از دستور

را برای مقید Rcw ،NET خوانده می شود. سرویس گیرنده Rcw را بست ه بندی می کند، 1 Com که ش ی NET خواهد کرد . شی

استفاده خواهد کرد که در بخش بعدی خواهید دید. Com کردن متدهای شی

-4-3-29 وارد کردن به صورت دستی

32 ثبت کنی د . سپس شما برای وارد کردن Regsvr خود کپی کرده و آن را با NET را به محیط Comcalculator.Dll فایل

آماده هستید. نحوهی کار به صورت زیر است: Tlbimp.exe با اجرای NFT به Com شی

dll Tlbimp.exe نام فایل out/: [نام فایل اسمبلی

12 را مشاهده کنید. - شکل 29

12- شکل 29

-5 ایجاد یک برنامه آزمایشی -3-22

نامگذاری کنی د . اگر تصمیم دارید ComDllTest ایجاد کنید و آن را Com حال می توانید یک برنام ه ی آزمایشی جهت ش ی

Add وارد کنید. برای انجام این کار در کادر محاو ر ه ای IDE کتابخانه را به صورت دستی وارد نکنید و آن را از طریق

13 را ببینید. - ثبت شده را مشخص کنید. شکل 29 Com را انتخاب کرده و ش ی Com برگه Reference

1 Runtime callable wrapper

COM و NET. فصل بیست و نهم برنامه نویسی

555

13- شکل 29

منتج شد را به مسیر RCW را احضار خواهد کرد و Tlbimp این عمل نرم افزار

C:\Documents and Settings\Administrator\Application

Data\Microsoft\VisualStudio\RCW.

کپی خواهد کرد.

را بکار برید، م ی توانید Tlbimp.exe است، اگر ComDll ای که آن تولید م ی کند هم نام Dll باید توجه داشته باشید، چون

را جستجو کرده و آن را به ComcalculaorDllNETDll اضافه کنی د . فهرستی ک ه Projects ارجاع را از طریق برگه

(14- ارجاع ها اضافه کنید. حال می توانید واسط برنامه را شبیه برنامه های قبلی ایجاد کنید. (همانند شکل 29

14- شکل 29

6 بنویسید. - کد مربوط به ادارهکننده های رویداد چهار دکمه را همانند مثال 29

6- مثال 29

#region Using directives

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Windows.Forms;

#endregion

namespace ComDLLTest

{

partial class Form١ : Form

{

public Form١( )

{

InitializeComponent( );

}

private void btnAdd_Click(

object sender, System.EventArgs e )

{

Double left, right, result;

left = Double.Parse( textBox١.Text );

right = Double.Parse( textBox٢.Text );

ComCalculatorDLLNET.ComCalc theCalc =

new ComCalculatorDLLNET.ComCalc( );

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

556

result = theCalc.Add( ref left, ref right );

label١.Text = result.ToString( );

}

private void btnSubtract_Click(

object sender, System.EventArgs e )

{

Double left, right, result;

left = Double.Parse(textBox١.Text);

right = Double.Parse(textBox٢.Text);

ComCalculatorDLLNET.ComCalc theCalc =

new ComCalculatorDLLNET.ComCalc( );

result = theCalc.Subtract(ref left, ref right);

label١.Text = result.ToString( );

}

private void btnMultiply_Click(

object sender, System.EventArgs e )

{

Double left, right, result;

left = Double.Parse( textBox١.Text );

right = Double.Parse( textBox٢.Text );

ComCalculatorDLLNET.ComCalc theCalc =

new ComCalculatorDLLNET.ComCalc( );

result = theCalc.Multiply( ref left, ref right );

label١.Text = result.ToString( );

}

private void btnDivide_Click(

object sender, System.EventArgs e )

{

Double left, right, result;

left = Double.Parse( textBox١.Text );

right = Double.Parse( textBox٢.Text );

ComCalculatorDLLNET.ComCalc theCalc =

new ComCalculatorDLLNET.ComCalc( );

result = theCalc.Divide( ref left, ref right );

label١.Text = result.ToString( );

}

}

}

ایجاد کنی د . Comcalculater.Comcalc که روی فرم قرار داد، باید نمون ه ای از Activex به جای ارجاع به یک کنترل

ایجاد شده باشد در دسترس اس ت . و اجرای برنامه همانند انتظار ما کار م ی کند . NET همانند شیئی که در اسمبلی Com شی

15 را ببینید. - شکل 29

15- شکل 29

-6-3-29 کاربرد مقید کردن دیرهنگام و انعکاس

فایل کتابخان ه ی نوع داده نباشد، باید مقید کردن دیرهنگام با انعکاس را بکار بری د . برای دیدن ، Com اگر برای یک ش ی

6 شروع کنید، اما ارجاع کتابخان ه ی وارد شده را حذف کنی د . باید ادراه کنند ه های رویداد چهار - نحوهی انجام کار، با مثال 29

ایجاد کنید، بلکه باید متدهای Comcalculater.ComCalc دکمه مجدداً نوشته شون د . شما نمی توانید یک نمونه از شی

آن را به طور پویا احضار کنید.

تعریف کنید. Comcalc جهت نگه داشتن اطلاعاتی در مورد نوع دادهی Type ابتدا باید یک شی

COM و NET. فصل بیست و نهم برنامه نویسی

557

Type comCalcType;

comCalcType = Type.GetTypeFromProgID("ComCalculator.ComCalc");

ثبت شده و بازیابی اطلاعات ضروری نوع داده شی ComDll را برای باز کردن NET چارچوب GetTypeFromProgID متد

است. GetType خاص راهنمایی می شود. این عمل معادل فراخوانی

Type theMathType = Type.GetType("System.Math");

اقدام کنی د . با فراخوانی NET حال م ی توانید همانند احضار یک متد روی یک کلاس شرح داده شده در یک اسمبلی

شروع کنید. Comcalc جهت برگرداندن یک نمونه از شی CreateInstance

object comCalcObject = Activator.CreateInstance(comCalcType);

احضار کنی د . InvokeMember سپس یک آرایه برای نگهداشتن آرگوما ن های آن ایجاد کنید و سپس متد را با استفاده از

و آرای ه ی آرگومان های ورودی را به CreateInstance نام متد را به صورت رشته، یک فیلد مقید کننده، شی منتج شده از

رد کنید. InvokeMember

object[] inputArguments = {left, right };

result = (Double) comCalcType.InvokeMember(

"Subtract", // the method to invoke

BindingFlags.InvokeMethod, // how to bind

null, // binder

comCalcObject, // the COM object

inputArguments); // the method arguments

ذخیره می شود. سپس می توانید این نتیجه را در Result قالب بندی شده و در متغیر محلی Double نتایج این فراخوانی به

16 می بینید. - واسط کاربر نمایش دهید. همانطور که در شکل 29

16- شکل 29

همه اداره کنند ه های رویداد باید این کار را تکرار کنند ، که فقط نام متد فراخوانده شده متفاوت است. کد مشترک را به یک

به کد System.Reflection را برای using 7 باید دستور - منتقل کنی د . مثال 29 Inroke متد کمکی خصوصی ب ه نام

منبع اضافه کند.

7- مثال 29

#region Using directives

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Reflection;

using System.Windows.Forms;

#endregion

namespace LateBinding

{

partial class Form١ : Form

{

public Form١( )

{

InitializeComponent( );

}

private void btnAdd_Click(

object sender, System.EventArgs e )

{

Invoke( "Add" );

}

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

558

private void btnSubtract_Click(

object sender, System.EventArgs e )

{

Invoke( "Subtract" );

}

private void btnMultiply_Click(

object sender, System.EventArgs e )

{

Invoke( "Multiply" );

}

private void btnDivide_Click(

object sender, System.EventArgs e )

{

Invoke( "Divide" );

}

private void Invoke( string whichMethod )

{

Double left, right, result;

left = Double.Parse( textBox١.Text );

right = Double.Parse( textBox٢.Text );

// create a Type object to hold type information

Type comCalcType;

// an array for the arguments

object[] inputArguments =

{ left, right };

// get the type info from the COM object

comCalcType =

Type.GetTypeFromProgID(

"ComCalculator.ComCalc" );

// create an instance

object comCalcObject =

Activator.CreateInstance( comCalcType );

// invoke the method dynamically and

// cast the result to Double

result = ( Double ) comCalcType.InvokeMember(

whichMethod, // the method to invoke

BindingFlags.InvokeMethod, // how to bind

null, // binder

comCalcObject, // the COM object

inputArguments ); // the method arguments

label١.Text = result.ToString( );

}

}

}

NET -4-29 صادرکردن قطعات

فراداد ه ی قطعه شما را در ،Regasm موجود صادر کنی د . ابزار Com خود را جهت استفاده در قطعات NET می توانید کلاس

رجیستری سیستم ثبت خواهد کرد.

نصب شده باشد. برای مثال: GAC باید در Dll احضار کنید. این فایل Dll را با نام فایل اسمبلی Regasm

Regasm MyAssembly.dll

ایجاد کنید و 4 C#Dll این عمل فرا داد ه ی قطعه شما را به رجیستری صادر خواهد کرد . مثال، می توانید یک پروژه جدید

8 را نشان می دهد. - عمل ماشین حساب را مجدداً ایجاد کنید. مثال 29

8- مثال 29

using System;

using System.Reflection;

[assembly: AssemblyKeyFile("test.key")]

namespace Programming_CSharp

{

COM و NET. فصل بیست و نهم برنامه نویسی

559

public class Calculator

{

public Calculator( )

{

}

public Double Add (Double left, Double right)

{

return left + right;

}

public Double Subtract (Double left, Double right)

{

return left - right;

}

public Double Multiply (Double left, Double right)

{

return left * right;

}

public Double Divide (Double left, Double right)

{

return left / right;

}

}

}

ذخیره کنی د . برای ایجاد یک نام ProgrammingCsharpDll در یک پروژه به نام Calculater.CS این فایل را با نام

- را انتخاب کرده و اسمبلی را امضاء کنی د . همانطور که در شکل 29 Signing خصوصیات پروژه را باز کنید و برگة Strong

17 می بینید.

17- شکل 29

18 باز خواهد کرد. - را همانند شکل 29 Create Key این عمل کادر محاوره آی

22- شکل 8

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

560

اضافه کرده و آن را ثبت کنید. GAC برنامهی خود را به

gacutil /i ProgrammingCSharpDLL.dll

Regasm ProgrammingCSharpDLL.dll

احضار کنی د . برای مثال، یک Com چهار تابع ماشین حساب را به عنوان یک ش ی VBScript حال می توانید با استفاده از

9 ایجاد کنید. - فایل اسکریپتی کوچک ویندوز همانند مثال 29

9- مثال 29

dim calc

dim msg

dim result

set calc = CreateObject("Programming_CSharp.Calculator")

result = calc.Multiply(٧،٣)

msg = "٧ * ٣ =" & result & "."

Call MsgBox(msg)

19 را ببینید.) - زمانی که آن اجرا شود، جهت تأیید نحوة کار ش ی، یک کادر محاوره ای باز می شود (شکل 29

19- شکل 29

-1-4-22 ایجاد یک کتابخانهی نوع داده

بکار برید، در حالت معمولی، یک کتابخانهی نوع داده ایجاد خواهید کرد . NET Dll اگر بخواهید مقید کردن زودهنگام را با

انجام دهید. TlbExp می توانید این کار را با استفاده نر مافزار کمکی

TlbExp ProgrammingCSharpDLL.dll /out:Calc.tlb

می توانید آن را یافته و مشاهده OLE/Com Object Viewer نتیجهی حاصله یک کتابخانهی نوع داده است که در برنامه

20 می بینید. - کنید. همانطور که در شکل 29

COM و NET. فصل بیست و نهم برنامه نویسی

561

20- شکل 29

وارد کنید. Com با این کتابخانهی نوع داده، می توانید کلاس ماشین حساب را به هر قطعه

P/Invoke-5-29

انجام داد ممکن FCL امکان پذیر است . در صورتی که نتوان یک کار را با استفاده از #C احضار کد مدیریت نشده از طریق

را به ندرت خواهید دید. P/Invoke کاربرد ،NET است کد مدیریت نشده استفاده شود. در نسخه 2,0 از

ویندوز استفاده می کند . اما م ی توانید برای API فقط برای فراهمکردن دسترسی به P/Invoke از NET Platform

از آن استفاده کنید. DLL فراخوانی توابع هر

را برای تغییر نام یک فایل به صورت زیر احضار می کنیم. FileInfo از کلاس MoveTo برای دیدن نحوهی کار آن، متد

file.MoveTo(fullName + ".bak");

بنا کنی د . برای انجام این کار به MoveFile از ویندوز و احضار متد .dll32Kernel می توانید همین کار را با استفده از

نیاز دارید. DllImport و کاربرد صفت Static Extern اعلان یک متد به صورت

[DllImport("kernel٣٢.dll", EntryPoint="MoveFile",

ExactSpelling=false, CharSet=CharSet.Unicode,

SetLastError=true)]

static extern bool MoveFile(

string sourceFile, string destinationFile);

فراخوانی P/Inroke کلاس برای مشخص کردن یک متد مدیریت نشده استفاده م ی شود که از طریق DllImport صفت

خواهد شد. پارامترهای آن به صورت زیر هستند.

ای که احضار می کنید. Dll نام :DllName

که فراخوانی می کنید را مشخص می کند. Dll نام متدی از :EntryPoint

تطابق دهد. CLR اجازه می دهد اسامی مختلف متدها را با قراردادهای نامگذاری CLR به : ExactSpelling

نحوهی مارشال شدن آرگومان های رشته ی به متد را نشان میدهد. :Charset

Marshal.GetLastWin32Error به شما اجازه داده م ی شود ،true با تنظیم این خصوصیت به مقدار :SetLastError

را فراخوانی کنید و آخرین خطایی که زمان احضار این متد رخ داده است بررسی کنید.

به صورت زیر تغییر نام را انجام دهید. MoveFile حال می توانید با فراخوانی متد

Tester.MoveFile(file.FullName,file.FullName + ".bak");

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

562

10- مثال 29

#region Using directives

using System;

using System.Collections.Generic;

using System.IO;

using System.Runtime.InteropServices;

using System.Text;

#endregion

namespace UsingPInvoke

{

class Tester

{

// declare the WinAPI method you wish to P/Invoke

[DllImport( "kernel٣٢.dll", EntryPoint = "MoveFile",

ExactSpelling = false, CharSet = CharSet.Unicode,

SetLastError = true )]

static extern bool MoveFile(

string sourceFile, string destinationFile );

public static void Main( )

{

// make an instance and run it

Tester t = new Tester( );

string theDirectory = @"c:\test\media";

DirectoryInfo dir =

new DirectoryInfo( theDirectory );

t.ExploreDirectory( dir );

}

// Set it running with a directory name

private void ExploreDirectory( DirectoryInfo dir )

{

// make a new subdirectory

string newDirectory = "newTest";

DirectoryInfo newSubDir =

dir.CreateSubdirectory( newDirectory );

// get all the files in the directory and

// copy them to the new directory

FileInfo[] filesInDir = dir.GetFiles( );

foreach ( FileInfo file in filesInDir )

{

string fullName = newSubDir.FullName +

"\\" + file.Name;

file.CopyTo( fullName );

Console.WriteLine( "{٠} copied to newTest",

file.FullName );

}

// get a collection of the files copied in

filesInDir = newSubDir.GetFiles( );

// delete some and rename others

int counter = ٠;

foreach ( FileInfo file in filesInDir )

{

string fullName = file.FullName;

if ( counter++ % ٢ == ٠ )

{

// P/Invoke the Win API

Tester.MoveFile( fullName, fullName + ".bak" );

Console.WriteLine( "{٠} renamed to {١}",

fullName, file.FullName );

}

else

{

file.Delete( );

Console.WriteLine( "{٠} deleted.",

COM و NET. فصل بیست و نهم برنامه نویسی

563

fullName );

}

}

// delete the subdirectory

newSubDir.Delete( true );

}

}

}

Output (excerpt):

c:\test\media\newTest\recycle.wav renamed to

c:\test\media\newTest\recycle.wav

c:\test\media\newTest\ringin.wav renamed to

c:\test\media\newTest\ringin.wav

اسمبلی ها و نسخه سازی

آنچه که در این فصل یاد خواهید گرفت:

ها DLL • استفاده از اسمبلیها به جای

انواع اسمبلیها و نحوهی ایجاد و کاربرد آنها

کاربرد اسمبلیهای خصوصی و اشتراکی

اجزای یک اسمبلی

استفاده از اسمبلیها در نسخهسازی

استفاده از اسامی قوی

یا اجرایی DLL است . اسمبلی یک کلکسیون از فای ل ها است ک ه بصورت یک فایل منفرد NET. اسمبلی، واحد اصلی توسعه در

ها کلکسیون هایی از کلا س ها و متدها هستند که فقط در صورت نیاز، به DLL ظاهر م ی گردد. همانطور که م ی دانید EXE

برنامهی در حال اجرا پیوند داده میشوند.

در استفاد ه ی مجدد، نسخ ه سازی، امنیت و توسعه هستن د . این فصل، اسمبل ی ها را بطور دقیق بررسی NET. اسمبلیها، واحد

میکند که مباحث معماری و محتوای اسمبلیها، اسمبلیهای خصوصی و اسمبلیهای اشتراکی را شامل میشود.

تعریف نوع داد ه ی هر کلاس و فراداد ه های دیگری ،GIF. اسمبلیها علاوه بر کدهای برنامه، م ی توانند منابعی همچون فای ل های

برای کد و داده را شامل شوند.

١PE -1-30 فایلهای

در PE مطلب جدیدی نیستن د . قالب یک فای ل PE در روی دیسک، اسمبل ی ها فایل های اجرایی قابل حمل هستن د . فایلهای

ها پیادهسازی میشوند. EXE ها و DLL بصورت PE عادی ویندوز است. فایلهای PE دقیقاً شبیه فایل ،NET.

از دید فیزیک ی ، اسمبلی ها یک یا چند ماژول را در بردارن د . ماژولها بخش های اصلی اسمبل ی ها هستند . ماژولها نمی توانند به

تنهایی اجرا شوند. آنها باید در داخل اسمبلیها ترکیب شوند تا قابل اجرا گردند.

شما محتوای یک اسمبلی را بصورت یک واحد قابل استفاد ه ی مجدد یا قابل توسعه خ و اهید دی د . اسمبلی ____________ها بر اساس

درخواست شما بارگذاری می شوند و در صورت عدم نیاز بارگذاری نخواهند شد.

-1-1-30 فراداده

فراداده ها اطلاعاتی هستند که در اسمبلی ذخیره م ی شوند و انواع داد ه ای و متدهای اسمبلی را شرح م ی دهند و اطلاعات

مفید دیگری دربارة اسمبلی فراهم م ی سازند. اسمبلی ها خود - شرح 1 خوانده م ی شوند، چون فرا داده ها بطور کامل محتویات

ماژول را شرح می دهند.

1 Portable Executable

فصل سی ام- اسمبلی ها

565

-2-1-30 محدوده های امنیت

اسمبلی ها محدودیت های امنیت را به خوبی محدودی ت های نوع داده شکل م ی دهند. یک اسمبلی محدود ه ی دامن ه ای برای

انواع داده ای داخل خود ا س ت و تعریف نوع داده نم ی تواند خلاف اسمبل ی ها رفتار کن د . می توانید با اضافه کردن یک ارجاع به

یا روی خط فرمان در IDE اسمبلی مورد نیاز، م ی توانید محدودیت های انواع داد ه ای سراسر اسمبلی بیان کنی د . این عمل در

، internal زمان کامپایل امکا ن پذیر است . نمی توانید یک نوع داد ه ای تعریف کنید که در دو اسمبلی باش د . معرف دستیابی

دسترسی را به داخل اسمبلی محدود م یکند.

-3-1-30 اظهارنامه 2 ها

هر اسمبلی یک اظهارنامه را به عنوان بخشی از فرادادة خود دار د . چیزهایی که در یک اسمبلی وجود دارن د : اطلاعات

شناسایی ( نام، نسخه، غیره )، یک لیست از انواع داد ه ای و منابع داخلی اسمبلی، یک لیست از ماژو ل ها، یک نقشه برای

به کد پیاده سازی آنها و یک لیست از اسمبلی هایی که این اسمبلی به آنها ارجاع دارد. public اتصال نوع داده های

می توانید اظهارنامه را بررسی کنی د . ،ILDASM حتی ساده ترین برنامه نیز یک اظهارنامه دار د . با استفاده از نر م افزار سود مند

1 ظاهر گردد. - باز کنید، اظهارنامه یک برنامه اجرایی میتواند شبیه شکل 30 ILDASM زمانی که اظهارنامه را در

1- شکل 30

2 باز - همانند شکل 30 Manifest به اظهارنامه توجه کنید ( خط دوم از بالا ). با دابل کلیک روی اظهارنامه یک پنجرة

می شود.

1 self describing

2 manifest

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

566

2- شکل 30

را mscorlib این فایل بصورت یک نقشه از محتویات اسمبلی بکار گرفته م ی شود. در خط اول م ی توانید ارجاع به اسمبلی

است و روی هر NET. اسمبلی کتابخانه هستة ،mscorlib ببینید که توسط هر اسمبلی دیگر نیز ارجاع داده میشو د . اسمبلی

در دسترس است. NET Platform.

خط بعدی اسمبلی، یک ارجاع به اسمبلی یک برنامه اس ت . می توانید ببینید که این اسمبلی فقط یک ماژول را در بردار د . در

حال حاضر می توانید مابقی فراداده را نادیده بگیرید.

-2-30 اسمبلی های چند ماژولی

2005 پشتیبانی نمی شود. یک اسمبلی تک VS اسمبلی ها م ی توانند بیش از یک ماژول را شامل شو ند. البته این عمل به وسیلة

باشد . این تک ماژول، همة انواع داد ه ای و پیاده سازی برنامه را DLL یا EXE ماژولی، فقط یک فایل دارد که م ی تواند یک فایل

در بردارد. اظهارنامه اسمبلی به وسیل هی این ماژول تعبیه می شود.

هر ماژول اظ ه ارنامة خودش را دارد که از اظهارنامة اسمبلی مجزا اس ت . اظهارنامة اسمبلی، اسمبل ی های ارجاع شده توسط این

اسمبلی خاص را لیست م ی کند. به علاوه، اگر ماژول انواع داد ه ای را اعلان کند، آنها به همراه کد پیاد ه سازی کنندة ماژول در

اظهار نامه لیست م یشوند. یک ماژول م یتواند منابعی همچون تصاویر مورد نیاز ماژول را در برگیرد.

را در بردار د . در این حالت، اظهارنام ه ی ( DLL یا EXE یک اسمبلی چندماژولی، چندین فایل (صفر یا بیشتر از صفر فایل

اسمبلی می تواند در یک فایل مستقل قرار گیرد یا در یکی از ماژو ل ها تعبیه گردد . زمانی که اسمبلی ارجاع داده می شود، در

زمان اجرا، فایل در بردارنده ی اظهارنامه بارگذاری می شود و سپس ماژول های مورد نیاز را بارگذاری م یکند.

-1-2-30 ایجاد یک اسمبلی چند ماژولی

برای نشان دادن اسمبل ی های چندماژولی، مثال زیر یک جفت ماژول بسیار ساده ایجاد م ی کند که آنها در ی ک اسمبلی واحد

است . این کلاس ساده ایجاد و دستکاری کسرهای عمومی را برای شما Fraction ترکیب می گردند. ماژول اول یک کلاس

1 را ملاحظه کنید. - ممکن می سازد. مثال 30

1- مثال 30

#region Using directives

فصل سی ام- اسمبلی ها

567

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace ProgCS

{

public class Fraction

{

private int numerator;

private int denominator;

public Fraction( int numerator, int denominator )

{

this.numerator = numerator;

this.denominator = denominator;

}

public Fraction Add( Fraction rhs )

{

if ( rhs.denominator != this.denominator )

{

return new Fraction(

rhs.denominator * numerator +

rhs.numerator * denominator,

denominator * rhs.denominator);

}

return new Fraction(

this.numerator + rhs.numerator,

this.denominator );

}

public override string ToString( )

{

return numerator + "/" + denominator;

}

}

}

اس ت . کلاس ProgCS.Fraction اس ت . نام کامل کلاس ProgCS در فضای نامی Fraction توجه کنید که کلاس

است که یک ()ADD را م ی گیرد . متد دیگر آن denominator و numerator در سازندة خود دو مقدار Fraction

مشترکی دارن د . این denominator ، دیگر گرفته و با قبلی جمع م ی کند. فرض بر این است که هر دو کسر Fraction

کلاس ساده است، اما عملکرد ضروری این مثال را نشان خواهد داد.

2 آن را نشان می دهد. - است که مثال 30 MyCalc کلاس دوم کلاس

2- مثال 30

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace ProgCS

{

public class MyCalc

{

public int Add( int val1, int val2 )

{

return val1 + val2;

}

public int Mult( int val1, int val2 )

{

return val1 * val2;

}

}

}

نیز در MyCalc یک کلاس بسیار محروم برای ساده نگه داشتن مطلب است، توجه کنید که کلاس MyCalc ، از طرف دیگر

است. ProgCS فضای نامی

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

568

برای اضافه کردن مقداری فراداده به AssemblyInfo.CS این موارد برای ایجاد یک اسمبلی کافی نیستن د . یک فایل

برای ایجاد VS را خودتان بنویسی د . اما روش ساد ه تر استفاده از AssemblyInfo.CS اسمبلی بکار بری د . می توانید فایل

اتوماتیک آن است.

در خط addModule/ فقط اسمبل ی های تک ماژولی ایجاد م ی کند. می توانید یک منبع چند ماژولی را با استفاده از گزینة VS

است . که می توانید با makefile فرمان ایجاد کنی د . ساده ترین راه، کامپایل و ایجاد یک اسمبلی چند م ا ژولی، با استفاده از

آشنا نیستید، نگران نباشی د . این تنها مثالی است که MAKEFILE یا هر ویرایشگر دیگر ایجاد کنی د . اگر با NotePad

نیاز دارد. makefile

را با کپی فای ل های makefile حاصل را نشان م ی دهد. برای اجرای این مثال، یک کپی از makefile 3 یک - مثال 30

را باز کرده و با NET. در یک فهرست قرار دهی د . یک پنجرة فرمان AssemblyInfo.CS و Calc.CS و Fraction.CS

را بدون هیچ سوئیچ در خط فرمان احضار کنی د . nmake به فهرست مورد نظر وارد شوی د . برنامه ی CD فرمان

خواهید یافت. Bin\ را در زیر فهرست MySharedAssembly.DLL

3- مثال 30

ASSEMBLY= MySharedAssembly.dll

BIN=.\bin

SRC=.

DEST=.\bin

CSC=csc /nologo /debug+ /d:DEBUG /d:TRACE

MODULETARGET=/t:module

LIBTARGET=/t:library

EXETARGET=/t:exe

REFERENCES=System.dll

MODULES=$(DEST)\Fraction.dll $(DEST)\Calc.dll

METADATA=$(SRC)\AssemblyInfo.cs

all: $(DEST)\MySharedAssembly.dll

# Assembly metadata placed in same module as manifest

$(DEST)\$(ASSEMBLY): $(METADATA) $(MODULES) $(DEST)

$(CSC) $(LIBTARGET) /addmodule:$(MODULES: =;) /out:$@ %s

# Add Calc.dll module to this dependency list

$(DEST)\Calc.dll: Calc.cs $(DEST)

$(CSC) $(MODULETARGET) /r:$(REFERENCES: =;) /out:$@ %s

# Add Fraction

$(DEST)\Fraction.dll: Fraction.cs $(DEST)

$(CSC) $(MODULETARGET) /r:$(REFERENCES: =;) /out:$@ %s

$(DEST)::

!if !EXISTS($(DEST))

mkdir $(DEST)

!endif

با تعریف اسمبلی مورد نظر جهت ساخت آغاز می گردد. makefile

ASSEMBLY= MySharedAssembly.dll

در زیرفهرست جاری قرار م ی دهد و کد BIN سپس فهرست های مورد استفادة شما را تعریف م ی کند. خروجی را در فهرست

منبع را از فهرست جاری بازیابی م یکند.

SRC=.

DEST=.\bin

اسمبلی را بصورت زیر ایجاد کنید.

$(DEST)\$(ASSEMBLY): $(METADATA) $(MODULES) $(DEST)

$(CSC) $(LIBTARGET) /addmodule:$(MODULES: =;) /out:$@ %s

می گوید، مقصد ساخت به مقصدهای سه nmake قرار می دهد. این دستور به bin این دستور اسمبلی را در فهرست مقصد

ساخت دیگر لیست شده وابسته هستند. آن دستورات مورد نیاز خط فرمان را برای ایجاد اسمبلی فراهم می سازد.

فراداده بصورت زیر تعریف می شود .

METADATA=$(SRC)\AssemblyInfo.cs

فصل سی ام- اسمبلی ها

569

تعریف می شوند. DLL ماژول ها بصورت دو تا

MODULES=$(DEST)\Fraction.dll $(DEST)\Calc.dll

خط کامپایل، کتابخانه را ایجاد م ی کند و ماژو ل ها را به آن اضافه م ی کند . سپس خروجی را در یک فایل اسمبلی

قرار می دهد. MySharedAssembly.DLL

$(DEST)\$(ASSEMBLY): $(METADATA) $(MODULES) $(DEST)

$(CSC) $(LIBTARGET) /addmodule:$(MODULES: =;) /out:$@ %s

شروع کنی د . nmake به Calc.DLL نحوه ی ایجاد ماژو ل ها را بدان د . با گفتن نحوة ایجاد nmake برای انجام این کار، لا زم است

بگویید. nmake مورد نظر به DLL را لازم دارید. خط فرمان زیر را برای ایجاد Calc.CS شما فایل منبع

(REFRENCES:=;) 4DEST)\CALC.DLL:CALC.CS $(DEST) $(CSC) $(MODULETARGET) /R:)$

/OUT:$@%S

انجام دهید. Fraction.DLL سپس همان کار را برای

DEST)\FRACTION.DLL:FRACTION.CS $(DEST) $(CSC) $(MODULETARGET) )$

(REFRENCES:=;) /OUT:$@%S4/R:

اگر .MySharedAssembly.DLL و Fraction.DLL ،Calc.DLL : ایجاد م ی شود DLL روی این، سه nmake با اجرای

.(3- باز کنید. خواهید دید که آن فقط یک اظهار نامه دارد(شکل 30 ILDASM را با MySharedAssembly.DLL

3- شکل 17

4- اگر اظهار نامه را بررسی کنید، فراداد ه های مربوط به کتابخان ه های ایجاد شده را خواهید دی د (همانطور که در شکل 30

می بینید).

4- شکل 30

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

570

و ProgCS.Calc خواهید دید که با دو ماژول (mscorlib) ابتدا یک اسمبلی خارجی برای کتابخانه هسته

دنبال می شوند. ProgCS.Fraction

و Calc.DLL به همراه اظهارنامه و MySharedAssembly.DLL : را در بردار د DLL حال شما یک اسمبلی دارید که سه فایل

به همراه انواع داد های و پیاده سازی آنها. Fraction.DLL

-2-2-30 آزمایش اسمبلی

4 را مشاهده کنی د . این برنامه را در فایل - برای کاربرد این ماژو ل ها، یک برنام ه ی راه انداز ایجاد خواهید کر د . مثال 30

همانند ماژو لهای دیگر در همان فهرست ذخیره کنید. Test.CS

4- مثال 30

namespace Programming_CSharp

{

using System;

public class Test

{

// main will not load the shared assembly

static void Main( )

{

Test t = new Test( );

t.UseCS( );

t.UseFraction( );

}

// calling this loads the myCalc assembly

// and the mySharedAssembly assembly as well

public void UseCS( )

{

ProgCS.myCalc calc = new ProgCS.myCalc( );

Console.WriteLine("3+5 = {0}\n3*5 = {1}",

calc.Add(3,5), calc.Mult(3,5));

}

// calling this adds the Fraction assembly

public void UseFraction( )

{

ProgCS.Fraction frac1 = new ProgCS.Fraction(3,5);

ProgCS.Fraction frac2 = new ProgCS.Fraction(1,5);

ProgCS.Fraction frac3 = frac1.Add(frac2);

Console.WriteLine("{0} + {1} = {2}",

frac1, frac2, frac3);

}

}

}

فصل سی ام- اسمبلی ها

571

خروجی:

3+5 = 8

3*5 = 15

3/5 + 1/5 = 4/5

قر ار ندهید . چون نمی خواهید ماژول هایتان ()Main برای درک اهداف این ارائه، مهم است هیچ کد وابسته به ماژو ل هایتان در

قرار داده نم ی شوند. زمانی ()Main در Fraction و Calc بارگذاری شون د . بنابراین هیچ شئ از ،()Main در زمان بارگذاری

را فراخوانی می کنید، قادر هستید بارگذاری ت کتک ماژو لها را ببینید. UseCalc و UseFraction که

بارگذاری اسمبلی

بطور AssemblyResolver . به داخل برنامه کاربردی بارگذاری م ی شود AssemblyResolver یک اسمبلی بوسیلة

فراخوانی م ی شود. نمی توانید آن را صریحاً فراخوانی کنی د . کار آن بارگذاری برنامة شما NET. اتوماتیک بوسیلة چارچوب

است.

17 یک نقطة - قرار گیرند. همانند شکل 5 bin 4 ایجاد و در زیرفهرست - ایجاد شده باید در همان فهرست مثال 30 DLL سه

قرار دهید. ()Main توقف در خط دوم

5- شکل 30

6 را ببینید). - تا نقطة شکست اجرا کرده و پنجرة ماژو لها را باز کنید. فقط دو ماژول ما بارگذاری می شود(شکل 30

6- شکل 30

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

572

را قبل از خط دوم ()System.Diagnostics.Debugger .Launch کار نمی کنی د، دستور VS.NET اگر در محیط

و debug/ را با گزینه های Test.CS قرار دهی د . این دستور استفاده از اشکا ل یاب را ممکن م ی سازد . ( برنامة ()Main

کامپایل کنید). r:MySharedAssembly.DLL/

وارد شوید، UseCS تا فراخوانی اولین متد پیش رفته و پنجره ماژول را ببینید. به محض اینکه، به دستور

بارگذاری DLL مورد نیاز است پس MySharedAssembly.DLL تشخیص م ی دهد یک ماژول از AssemblyLoader

7 بارگذاری - را لازم دار د . این ماژول همانند شکل 30 Calc.DLL می شود و از اظهارنامة اسمبلی در م ی یابد که ماژول

می شود.

نهایی نیز بارگذاری م یشود. DLL ، وارد شوید UseFraction زمانی که به دستور

-3-2-30 اسمبلی های خصوصی

اسمبلی ها به دو صورت استفاده م ی شوند: خصوصی و اشتراک ی . اسمبلی های خصوصی فقط در یک برنامة کاربردی استفاده

می شوند. اسمبلی های اشتراکی مابین چندین برنامه به اشتراک گذاشته م یشوند.

هنگام کامپایل، اسمبلی خصوصی #C همة اسمبل ی هایی که تا بحال ساخت ه اید، خصوصی هستن د . بطور پیش فرض، کامپایلر

ایجاد می کند. همة فایل های اسمبلی در پوشة یکسانی (یا در ساختار درختی از زیر پوش ه ها) ذخیره می شوند . این درخت

پوشه ها، از مابقی سی س تم مجزا است و م ی توانید با کپی کردن پوش هها به سیستم دیگر، این برنامه را به آن سیستم نیز

منتقل کنید.

برای اسمبلی خصوصی م ی توانید هر نامی را انتخاب کنی د . تداخل اسمی با اسمبل ی های برنامة دیگر مهم نیس ت . چون این

اسمبلی ها برای برنامه بصورت محلی استفاده می شوند.

ها روی سیستم نصب م ی شدند و در ریجستری ویندوز یک مشخصه ایجاد م ی شد و در بعضی موارد نصب DLL ، در گذشته

مجدد برنامه روی ماشین دیگر قابل توجه بو د . اما در صورت استفاده از اسمبل ی ها، نصب یک برنامه به سادگی عمل کپی

فایل ها به یک فهرست مناسب است.

-4-2-30 اسمبلی های اشتراکی

می توانید اسمبلی هایی ایجاد کنید و با برنام ه های دیگر به اشتراک گذاری د . در صورتی که یک کلاس یا کنترل کلی نوشتید که

توسط توسعه دهندگان دیگر قابل استفاده باشد، اسمبل ی های اشتراکی مفید هستن د . اگر بخواهید یک اسمبلی را به اشتراک

گذارید، باید نیازمندی های دقیقی را برآورده سازید:

فصل سی ام- اسمبلی ها

573

اولاً : باید اسمبلی شما یک نام قوی داشته باشد. اسامی قوی، اسامی منحصر بفرد سراسری هستند.

هیچ فرد دیگری نمی تواند نام قوی یکسانی تولید کند. چون اسمبلی تولید شده با کلید خصوصی تضمین می کند،

نام متفاوتی با اسمبل یهای تولید شده توسط کلیدهای خصوصی دیگر دارد.

ثانیاً: اسمبلی اشتراکی باید در مقابل پایمال شدن توسط نسخه های جدید محافظت گردد و هر نسخة جدید منتشر شده، باید

شمارة نسخة جدیدی داشته باشد .

برای نگه CLR قرار دهید. این بخشی از سیستم فایل است که به وسیلة GAC نهایتاً: برای اشتراک گذاری اسمبلی، آن را در

داشتن اسمبل یهای اشتراکی کنار گذاشته می شود.

DLL -5-2-30 پایان جهنم

را روی ماشین خود نصب کردید و A ها هستند . این سناریو را به خاطر بسپاری د . شما برنامة DLL اسمبلی ها پایانی برای جهنم

را روی B شما بارگذاری می کند. چند ماه با آن کار م یکنید، سپس برنامة Windows ها را به فهرست DLL آن یک تعداد از

بهم مرتبط نیستن د ). پس چه اتفاقی B و A اجرا نم ی شود(برنامة A ماشین خود نصب م ی کنید. بصورت غیرقابل انتظار برنامة

غیرقابل اجرا شده است. A را جایگزین کرده است و برنامة A های برنامة DLL یکی از B افتاده است؟ برنامة

ها با DLL ، ها اختراع شدند، بدلیل صرف ه جویی فضای دیسک، ایده بسیار خوبی به نظر م ی رسیدند. در فرضیه DLL زمانی که

می گوید در Pat Johnson به روز م یشوند. اما DLL نسخه های قبلی سازگار هستند و بطور اتوماتیک به نسخ ههای جدید

جدید به کامپیوتر اضافه م ی شود، DLL فرضیه، فرضیه و عمل یکسان هستند، اما در عمل هرگز اینطور نیس ت . زمانی که

جدیدی متصل می گردد، که با آن DLL موجود در سیستم استفاده م ی کرده است، بطور ناگهانی به DLL برنامه ی قدیمی که از

ناسازگار است و این برنامه برخلاف انتظار، متوقف م ی گردد. این پدیده منجر ش د ه است، مشتریان از نصب نر م افزارهای جدید

یا حتی به روز کردن برنامه های موجود دوری کنند. اما با حضور اسمبل یها این کابوس از بین رفت.

-3-30 نسخه ها

اجازه م ی دهد نسخ ه های GAC . اسمبلی های اشتراکی بطور منحصربفرد به وسیله نام و نسخة آنها معین م ی شوند NET. در

جدید و قدیمی یک اسمبلی در کنار همدیگر مورد استفاده قرار گیرن د . این عمل فقط برای اسمبل ی های اشتراکی اعمال

می گردد و در مورد اسمبل یهای خصوصی نیاز نیست.

( 4 عدد که با کالن از هم جدا شد ه اند). دو عدد اول ( 1:0 ) ممکن است شمارة نسخة یک اسمبلی شبیه این باش د : 1:0:2204:21

نسخه های اصلی و فرعی هستند. عدد سوم ( 2204 ) شمارة ساخت و عدد چهارم ( 21 ) شمارة تجدید نظر است.

زمانی که دو اسمبلی شماره های اصلی و فرعی متفاوتی داشته باشند، آنها قانوناً باهم ناسازگار هستند. زمانی که شمار ه های

ساخت متفاوتی دارند، ممکن است آنها سازگار باشند یا نباشند . زمانی که فقط شمار ه های تجدیدنظر متفاوت باشند، آنها

این قانون را کنار گذاشته و فقط آنها را برای CLR در AssemblyResolver باهم سازگار م ی باشند. این یک تئوری است، اما

یادآوری توسعه دهنده بکار می گیرند.

-1-3-30 اسامی قوی

برای استفادة یک اسمبلی اشتراکی، باید دو نیاز را برآورده سازید:

باید بتوانید نام دقیق اسمبلی مورد نظر خود را مشخص کنید.

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

574

لازم است مطمئن شوید، در اسمبلی مورد استفاده فضولی نشده است و توسط سازنده واقعی آن تائید شده باش د .

بدین دلیل در زمان ایجاد اسمبلی شما یک امضاء دیجیتالی لازم دارید.

این دو نیازمندی بوسیلة اسامی قوی برآورده م ی شوند. اسامی قوی بصورت سراسری و منحصربفرد هستند و رمزنگاری کلید

عمومی را بکار می برند. نام قوی یک رشته از ارقام هگزا است و توسط انسان قابل خواندن نیست.

برای ایجاد یک نام قوی، یک جفت کلید عمومی - خصوصی برای یک یا چند اسمبلی ایجاد م ی شود . یک درهم سازی

با کلید خصوصی اسمبلی رمزگذاری Hash از نا م ها و محتویات فای ل های موجود در اسمبلی گرفته م ی شود. سپس (Hash)

هشت بایتی از کلید کامل ) در قسمت اظهارنامه بهمراه کلید عمومی قرار م یگیرد . Hash می شود و نشانة کلید عمومی ( یک

Hash برای کدگشایی CLR . این عمل به امضا ء کردن اسمبلی معروف اس ت . زمانی که یک برنامه، اسمبلی را بارگذاری م ی کند

فایل های اسمبلی، از کلید عمومی استفاده م ی کند، تا مطمئن شود این فای ل ها دستکاری نشد ه اند. این عمل از تداخل اسمی

نیز جلوگیری می کند.

می توان یک نام قوی ایجاد کرد. sn با استفاده از نرم افزار کمکی

sn -k c:\myStrongName.snk

برای مشخص کردن ایجاد یک جفت کلید جدید است که به فایل مشخص شده نوشته م ی شود. می توانید این فایل k– پرچم

را هر کجا که دوست دارید بکار بری د . به خاطر دارید که یک نام قوی، رشت ه ای از بای ت ها است که توسط انسان قابل خواندن

نیست.

با استفاده از یک صفت م یتوانید این نام قوی را به اسمبلی خودتان اختصاص دهید.

using System.Runtime.CompilerServices;

[assembly: AssemblyKeyFile("c:\myStrongName.key")]

در حال حاضر، می توانید این کد را در بالای فایل خود قرار دهید تا نام قوی را به اسمبلی شما اختصاص دهد.

GAC-2-3-30

GAC زمانی که نام قوی را ایجاد کردید و آن را به اسمبلی خود اختصاص دادید، کاری که مانده است قرار دادن اسمبلی در

اضافه کنید. GAC می توانید اسمبلی را به ،gacutil می باشد. با استفاده از نرم افزار کمکی

gacutil /i MySharedAssembly.dll

در مسیر GAC . بکشید GAC را باز کرده و اسمبلی مورد نظر را به File Explorer یا می توانید

قرار دارد. SystemRoot%\assembly%

-3-3-30 ایجاد یک اسمبلی اشتراکی

4 را - 1 تا 30 - بهترین روش فهم اسمبلی اشتراکی، ایجاد یک نمونه اس ت . به پروژة چندماژولی اخیر بر گ ردید (مثالهای 30

بروید. Fraction.CS و Calc.CS بببنید ) و به فهرست مربوط به فای لهای

را برای برنامة مورد نظر پیدا کرده و مطمئن شوید کپی محلی از bin سعی کنید این آزمایش را انجام دهی د : فهرست

را ندارید. MySharedAssembly.DLL فایل های

مقدار دهی کنید . برنامه را اجرا کنی د . false را CopyLocal خصوصیت (MySharedAssembly) در اسمبلی ارجا ع شده

آن برنامه با یک استثناء موفق نم یشود، چون آن نم یتواند اسمبلی را بارگذاری کند.

Unhandled Exception: System.IO.FileNotFoundException: File or assembly name

MySharedAssembly, or one of its dependencies, was not found.

File name: "MySharedAssembly"

at Programming_CSharp.Test.UseCS( )

at Programming_CSharp.Test.Main( )

فصل سی ام- اسمبلی ها

575

ها را به فهرست برنامه مورد نظر کپی کنید و آن را دوباره اجرا کنید. حال برنامه شما بطور موفق اجرا م یشود. DLL حال

را یک اسمبلی اشتراکی کنیم. دو مرحله دارد: اولاً یک نام قوی برای MySharedAssembly حال اجازه دهید اسمبلی

قرار دهید. GAC اسمبلی ایجاد کنید و سپس اسمبلی را در

مرحلة 1:ایجاد یک نام قوی

در خط فرمان با استفاده از دستور زیر یک جفت کلید ایجاد کنید.

sn -k keyFile.snk

را باز کرده و این خط را تغییر دهید. MySharedAssembly.DLL مربوط به AssemblyInfo.CS حال فایل

[assembly: AssemblyKeyFile("")]

را بصورت زیر تغییر دهید .

[assembly: AssemblyKeyFile("keyFile.snk")]

باز ILDASM منتج را در DLL این عمل فایل کلید را برای اسمبلی تنظیم م ی کند. فایل اسمبل ی را مجدداً ایجاد کنید و سپس

8 می بینید). - کرده و اظهارنامه را باز کنید. شما باید یک کلید عمومی ببینید(همانطور که در شکل 30

8- شکل 30

و ارجاع در اظه ا رنامة سرویس GAC بوسیلة اضافه کردن نام قوی، این اسمبلی را امضاء کردی د . برای نمایش اینکه اسامی

رفته و دستور زیر را در DLL خواهید گرفت. برای انجام این کار، به فهرست مربوط به DLL گیرنده تطابق دارند، نام قوی را از

خط فرمان وارد کنید.

sn -T MySharedAssembly.dll

به حالت حروف حساس است. جواب این دستور باید چیزی شبیه این باشد: SN توجه کنید که

Public key token is 01fad8e0f0941a4d

. GAC مرحله دوم: قرار دادن اسمبلی اشتراکی در

را باز کنید و به فهرست Explorer است . بدین منظور، پنجرة GAC مرحلة بعدی کشیدن اسمبلی کتابخانه به داخل

Explorer توسط GAC دابل کلیک کنید، برنامة نمایش Assembly بروید، زمانی که روی زیر فهرست %SystemRoot%

شروع می شود.

بکشید یا برنامة کمکی زیر را در خط فرمان احضار کنید. GAC می توانید اسمبلی را به داخل

Gacutil /i mySharedAssembly.dll

9 را - مطابقت دارد ؟ ش ک ل 30 sn حال می توانید بررسی کنید که نشانة کلید عمومی در اینجا با نشانة بدست آمده از دستور

ملاحظه کنید .

9- شکل 30

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

576

به محض اینکه این کار انجام ش د . شما یک اسمبلی اشتراکی دارید که م ی تواند توسط هر سرویس گیرنده دستیابی شو د .

10 نشان داده - برنامة مورد نظر را نوسازی کرده و مجدداً آن را ایجاد کنید و اظهارنامة آنرا ببینی د (همانطور که در شکل 30

شده است).

10- شکل 30

است که بصورت یک اسمبلی خارجی لیست می شود و کلید عمومی آن با مقدار نشان داده MySharedAssembly این

مطابقت دارد. GAC شده در

های این کتابخانه در مسیر جاری نباشن د . DLL را بسته و کد خود را اجرا کنی د . آن باید درست کار کند حتی اگر ILDASM

شما یک اسمبلی اشتراکی ایجاد و استفاده کردید.

-4-3-30 اسمبلی های مورد نیاز دیگر

اظهارنامة اسمبلی، ارجا ع هایی به اسمبل ی های دیگر دارد . هر ارجاعی، نام اسمبلی دیگر، شمار هی نسخه، فرهنگ مورد نیاز و

نشانه ی کلید عمومی اسمبلی دیگر (یک امضاء دیجیتالی) را در بردارد.

فرهنگ، یک رشته است که مشخص ه های ملی و زبان را برای کاربری که برنام ه ی شما بکار م ی برد نمایش م ی دهد. در فرهنگ،

فرمت تاریخ معین می شود. به عنوان مثال تاریخ با فرمت (سال/ روز / ماه ) یا (سال / ماه /روز ) نمایش داده شود.

 

ضمیمه 1

2005#C نصب ویژوال

به گونه های مختلفی #VC . را شروع کنیم، باید آن را در کامپیوتر خود نصب کنیم #VC و VS قبل از اینکه بتوانیم استفاده از

ای که شما از آن استفاده می کنید، ممکن است به یکی از حالت های زیر #C توسط مایکروسافت ارائه شده است. نسخه ی

باشد:

و #J ،VB 2005 ، که یک مجموعه از ابزارها و زبا نهای برنام هنویسی است. این مجموعه شامل VS - به عنوان بخشی از

VS Team و Tools For Office ،Professional ،Standard در نسخه های VS . می شود ++VC نیز

منتشر شده است. هر کدام یک از این نسخه ها نسبت به نسخه ی قبلی از امکانات و ابزارهای بیشتری System

برای برنام هنویسی بهره مند هستند.

است که شامل یک سری از امکانات و ویژگی های محدود #VC این نگارش نسخ های از :Express - به عنوان نگارش

می شود. VS در

شکل 1

با شما این امکان را می دهد تا برای ویندوز برنامه بنویسید. مراحل نصب هر دوی آنها کاملا واضح است. #C این دو نسخه از

آنقدر باهوش است که بفهمد برای اجرا شدن روی کامپیوتر شما به چه چیزهایی نیاز دارد. VS در حقیقت، باید گفت

Team System 2005# با نسخه ی VC مراحل نصب

CD 2005 ، برنام هی نصب بطور اتوماتیک اجرا می شود. اگر اجرا نشد در درایو مربوط به VS مربوط به CD -1 با قرار دادن

را اجرا کنید. بعد از اجرای برنامه باید صفحه ای مشابه شکل 1 ببینید. setup.exe برنامه ی

نیاز دارد که یک سری از برنام ههای روی VS ، -2 این پنجره مراحل نصب را نشان م یدهد. برای اجرای درست فرایند نصب

سیستم عامل را به روز کند. برنامه ی نصب لیستی از موارد مورد نیاز جهت نصب را به شما نشان می دهد و شما باید قبل از

و نصب آن VS ضمیمه 1- آشنایی با محیط

579

تغییرات لازم در سیستم را انجام داد، وارد نصب خود برنامه می شویم. VS این برنامه ها را نصب کنید. بعد از اینکه ،VS نصب

کلیک کنید. Install Visual Studio برای این مرحه روی

کلیک کنید تا به مرحله بعد بروید. Continue -3 بعد از پذیرفتن قرارداد شرکت، روی

در اختیار شما قرار می گیرد که عبارتند از: VS -4 در این مرحله رو شهای مختلف نصب

با ابزارهایی که بصورت پیش فرض انتخاب شد هاند در سیستم نصب شود. VS این گزینه باعث می شود :Default -

و تمام ابزارهای جانبی آن به صورت کامل در سیستم شما نصب می شوند. اگر از نظر VS ، با انتخاب این گزینه :Full -

فضایی که با انتخاب این گزینه در سیستم شما اشغال می شود مشکلی ندارید، بهتر است که هنگام نصب، این گزینه

بصورت کامل نصب شود. VS را انتخاب کنید تا

نمایش داده می شوند و م یتوانید انتخاب VS با انتخاب این گزینه، لیستی از تمام قسم تهای موجود در :Custom -

کنید که کدام قسم تها باید نصب شوند و کدامیک نباید نصب شوند.

را انتخاب کرده و دکمه ی Custom نیز آشنا شویم، گزین هی VS در این مرحله برای اینکه با قسمت های موجود در

را فشار دهید. Next

را می توانید ببینید. بدین ترتیب م یتوانید فقط قسمت هایی را که VS -5 با وارد شدن به این قسمت، لیست اجزای قابل نصب

2005 استفاده نمی کنید، می توانید آن را VC++ به آنها نیاز دارید نصب کنید. برای مثال، اگر فضای دیسک شما کم است و از

SQL Server نصب نکنید. در این قسمت همچنین می توانید مکان نصب برنامه را نیز تعیین کنید. در این قسمت باید

را انتخاب کنید. Express 2005

برای هر گزینه از لیست سه قسمت وجود دارد که اطلاعات آن را نمایش م یدهند:

یک طرح کلی و کارا از قسمت انتخاب شده را شرح م یدهد. Feature Description - قسمت

مکانی که فایل های بخش انتخاب شده در آن نصب م یشوند را نشان می دهد. Feature Install Path - قسمت

به شما نشان می دهد که با نصب بخش انتخاب شده، فضای Disk Space Requirements - در نهایت، قسمت

دیسک شما چگونه تغییر می کند.

2005# اطلاعات زیادی از دیسک به حافظه .و برعکس منتقل VC به پایان رسید، در زمان اجرای VS بعد از اینکه نصب

فضای خالی نیاز MB می شوند. تعیین مقدار دقیق حافظ هی مورد نیاز ممکن نیست. برای برنام هنویسی بهتر، حداقل به 100

است.

شکل 2

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

580

کلیک کنید. حالا شما می توانید مقداری استراحت کنید، تا Install -6 بعد از انتخاب قسم تهای مورد نظر، روی گزینه

برنامه بر روی سیستم نصب شود. زمان مورد نیاز برای نصب بسته به قسم تهای انتخاب شده بستگی دارد.

-7 هنگامی که نصب برنامه تمام شد، صفح های را مشاهده می کنید که پایان نصب را اطلاع م یدهد. در این مرحله، برنامه ی

نصب هر شمکی که با آن روبرو شده باشد را گزارش م یدهد. همچنین در این مرحله م یتوانید گزارش عملکرد را نیز بررسی

شویم. VS کلیک کنید تا وارد بخش نصب مستندات یا راهنمای Done کنید. روی گزین هی

2005#VC محیط توسعه ی

2005# نیازی ندارید. می توانید برنام هی خود را با VC به برنامه ی ،#C در ابتدا جالب است بدانید که برای برنام هنویسی به زبان

NotePad معمولا طولانی هستند و نوشتن آنها با #VC نیز بنویسید. اما برنامه های NotePad یک ویرایشگر متنی مانند

معروف است. IDE است که به VS زمان زیادی را صرف می کند. انتخاب بهتر برای انجام این کار، استفاده از محیط توسعه ی

امکانات بسیار زیادی را در اختیار شما قرار می دهد که بطور یقین با استفاده از ویرایشگرهای متنی به آنها VS مربوط به IDE

دسترسی نخواهید داشت.

شکل 3

Profile Setup صفحه ی

2005 را اجرا کنید VS . محیطی است شامل یک سری ابزار که موجب سهولت کار توسعه و طراحی نرم افزار می شود ،IDE یک

بروید و در Start تا ببینید با چه چیزی روبرو می شوید. اگر شما مراحل پیش فرض نصب را انتخاب کرد هاید، به منوی

Microsoft Visual Studio 2005 گزینه ی Microsoft Visual Studio و زیر منوی All Programs شاخه ی

Choose Default به سرعت نمایش داده می شود و بعد از آن پنجر هی VS 2005 را اجرا کنید. صفحه ی شروع

را Visual C# Development Settings را خواهید دید. از لیست ظاهر شده گزینه ی Environment Settings

کلیک کنید. محیط توسعه مایکروسافت همانند شکل 3 نمایش داده خواهد Start Visual Studio انتخاب کرده و روی

شد.

و نصب آن VS ضمیمه 1- آشنایی با محیط

581

منو

را بررسی کنیم. گردش خودمان را در IDE احتمالا اشتیاق زیادی برای شروع کد نویسی دارید. اما در ابتدا بهتر است کمی

از منوها و نوارهای ابزار شروع می کنیم. همانطور که می بینید منوها و نوار ابزارها در این برنامه نیز تفاوت چندانی با IDE

ندارد. Excel و یا Word برنامه های دیگر مایکروسافت از قبیل

2005 به صورت دینامیک است یعنی بر حسب کاری که می خواهید انجام دهید یک سری از گزینه ها به منو VS نوار منوی

شامل گزین ههای VS خالی را در مقابل خود دارید، منوی IDE اضافه شده و یا از آن حذف م یشوند. وقتی فقط محیط

است. اما هنگامی Help و منوی Community , Window, Test , Tools , Data , View ,Edit , File

همانند شکل 4 نمایش داده خواهد شد. VS که کاربر یک پروژه را شروع کند، منوی کامل

شکل 4

در اینجا به توضیح کامل در مورد همه ی منوها نیازی نداریم. در طول این کتاب به مرور با تمامی آنها آشنا خواهید شد. اما در

زیر برای آشنایی اولیه شرح مختصری از عملکرد هر یک از منوها آورده شده است:

به نظر می رسد که همه برنامه های ویندوزی یک منوی فایل دارند. در این منو حداقل چیزی که پیدا می شود : File •

این برنامه گزینه های بیشتری مثل بازکردن – بستن یا File راهی برای خارج شدن از برنامه است. البته در منوی

ذخیره کردن یک فایل خاص و یا تمام پروژه هم وجود دارد.

Undo, Redo, Cut, : این منو هم مثل برنام ههای دیگر شامل گزین ههایی است که انتظار آن را دارید : Edit •

. Delete وCopy , Paste

Explorer Solution مثل IDE به شما اجازه می دهد تا به سرعت به پنجره های موجود در View منوی : View •

ها و... دسترسی داشته باشید. Output , Toolbar پنجره ی , Properties و پنجره ی

این منو به شما اجازه می دهد تا فایل های مختلف از قبیل فرم های جدید و یا کلا سها را به برنام هی خود :Project •

اضافه کنید.

این منو زمانی مفید خواهد بود که برنام هی خود را تمام کنید و بخواهید که آن را بدون استفاده از محیط : Build •

( Excel و یا Word مثل همه ی برنامه های ویندوزی دیگر از قبیل ،Start اجرا کنید(احتمالا از طریق منوی #VC

خط به خط اجرا کنید. همچنین از VS این منو به شما اجازه م یدهد تا برنامه خودتان را در داخل محیط : Debug •

می توانید عملکرد Debugger نیز دسترسی خواهید داشت. به وسیله VS از 2005 Debugger طریق این منو شما به

کد خود را در هنگام اجرای برنامه خط به خط بررسی کرده و مشکلات آن را متوجه شوید.

آن به شما کمک می کند تا از اطلاعات به دست آمده از یک بانک اطلاعاتی استفاده کنید. البته این منو : Data •

قسمت ،VS زمانی نمایش داده م یشود که در حال کار بر روی قسم تهای بصری برنامه خود باشید(در پنجره اصلی

فعال باشد)، نه زمانی که در حال نوشتن کد هستید. (Design)

این منو نیز فقط زمانی که در حال کار با قسم تهای بصری برنامه باشید، نمایش داده م یشود. به وسیله : Format •

ها، دکمه ها و...) را TextBox گزینه های این منو می توانید طریقه قرار گرفتن اشیای موجود در فرم برنامه (از قبیل

کنترل کنید.

را کنترل و یا تنظیم کنید. همچنین پیوندی به برنامه های IDE VS در این قسمت می توانید محیط 2005 :Tools •

نیز، در این قسمت وجود دارد. VS اضافی نصب شده در کنار

به شما اجازه می دهد برنامه هایی ایجاد کنید تا به وسیله آن بتوانید بعد از اتمام یک برنامه، Test منوی : Test •

قسمت های مختلف آن را از نظر کارایی و یا عملکرد بررسی کنید.

این منو در هم هی برنامه هایی که امکان باز کردن بیش از یک پنجره در هر لحظه را به کاربر م یدهند، : Window •

نیز وجود دارد. گزینه های موجود در این منو به شما اجازه م یدهند که در بین پنجره های ،Excel ویا Word مثل

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

582

باز هستند، در پایین نوار ابزار نمایش VS جابه جا شوید. نام پنجر ههایی که در هر لحظه در محیط IDE موجود در

داده م یشوند که با کلیک کردن روی هر کدام از آنها پنجره ی مربوطه نمایش داده می شود.

این منو دسترسی به منابع برنام هنویسی، مکان هایی برای پرسیدن سوالات و نیز جستجو بین نمونه ی :Community •

کدها را در اینترنت فراهم می کند.

را می دهد. راه های زیادی برای دسترسی به این VS به شما اجازه ی دسترسی به مستندات 2005 Help منوی :Help •

اطلاعات وجود دارند (برای مثال، از طریق محتویات، اندیس و یا جستجو). این منو همچنین دارای گزین ههایی برای

وصل شدن به وب سایت مایکروسافت، دریافت آخرین نسخ ههای به روزرسانی و همچنین گزارش دادن مشکلات

برنامه است.

نوار ابزارها

برای حذف یا .Text Editor و یا Image Editor ،Formatting وجود دارند، مانند IDE VS نوار ابزارهای زیادی در

استفاده کنید. هر کدام از این نوار ابزارها، View در منوی Toolbars اضافه کردن این نوار ابزارها، می توانید از گزینه ی

دسترسی سریع شما را به یک دستور پرکاربرد فراهم می کند. بدین صورت مجبور نخواهید بود که هر بار برای اجرای آن

از نوار منو، به وسیله ی نوار ابزار استاندارد ..File􀃆New􀃆Project دستور منوها را جستجو کنید. برای مثال، گزینه ی

(شکل 5) قابل دسترسی است.

شکل 5

نوار ابزار استاندارد به چند بخش که شامل گزینه های مرتبط به هم هستند تقسیم شده است. هر بخش به وسیل هی یک خط

عمودی از بخش های دیگر تفکیک شده است. پنج آیکون اول، شامل کارهای عمومی بر روی فایل و یا پروژه هستند. که از

قابل دسترسی هستند، مانند باز کردن و یا ذخیره کردن فایل ها. Project و یا منوی File طریق منوی

گروه بعدی نیز برای لغو کردن آخرین عمل .(Paste و Copy ،Cut) گروه بعدی آیکو نها، برای ویرایش استفاده م یشوند

انجام شده، برگرداندن عمل لغو شده و ... است.

گروه چهارم از آیکو نها به شما اجازه م یدهد اجرای برنامه ی خود را شروع کنید.(بوسیله ی مثلث سبز رنگ). در این قسمت

همچنین می توانید پیکربندی برنام هی خود را مشخص کرده و یا نحوه ی اجرای آن را تعیین کنید.

پنجره ی ،Solution Explorer مانند VS گروه آخر از آیکو نها دسترسی سریع شما را به قسمت های مختلف

و یا صفحات دیگر فراهم می کند. اگر هر کدام یک از این Start Page ،Object Browser ،Toolbox ،Properties

پنجره ها بسته شده باشد، با کلیک بر روی آیکون آن در این قسمت، پنجره ی مورد نظر نمایش داده خواهد شد.

نکته: اگر فراموش کردید که هر آیکون چه کاری انجام می دهد، اشاره گر ماوس خود را برای چند لحظه بر روی آن نگه دارید.

بدین ترتیب کادری ظاهر می شود که نام آیکون مورد نظر را نمایش م یدهد._

Mohsen_mahyar@yahoo.com

پایان-موفق باشید  محسن قاسمی

 

   + MOHSEN GHASEMI - ٩:۳٤ ‎ق.ظ ; ۱۳۸٩/٥/۸