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


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

اسمبلی ها و نسخه سازی در#C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @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#اسمبلی ها و نسخه سازی در

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

ها 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

اسلام احمد زاده - 09177112161 - 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

Mohsen_mahyar@yahoo.com - 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 - C# برنامه نویسی

 

 

.__

 

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