اسمبلی ها و نسخه سازی در#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 loa

/ 1 نظر / 90 بازدید
hajar

salam