PDA

View Full Version : مقاله: دسترسی به اسمبلی های ایجاد شده در دات نت از طریق VB6



Mehdi Asgari
دوشنبه 19 اسفند 1387, 16:22 عصر
دسترسی به اسمبلی های ایجاد شده در دات نت از طریق VB6
عنوان اصلی: How to call a Visual Basic .NET or Visual Basic 2005 assembly from Visual Basic 6.0

چکیده: در این مقاله یاد می گیریم که چطور از داخل VB6 ، از اسمبلی (DLL) هایی که توسط یکی از زبان های دات نت (مثلا C# یا VB .NET) ایجاد شدن ، استفاده کنیم. فرض می کنم خواننده آشنایی متوسط با VB6 و دات نت داره.
سطح: متوسط
پیش نیاز ها: نصب بودن Visual Studio 2005 یا 2008 و Visual Basic 6 بر روی سیستم
ترجمه: مهدی عسگری

توجه: با توجه به این که سطح مخاطبم رو متوسط فرض کردم ، توضیحات اضافی ندادم (همچین فرض کردم با اصطلاحاتی چون اسمبلی و اینترفیس و ... آشناست)

توضیحاتی جهت استفاده از انواع .NET در COM
وقتی که می خواهید یک نوعی رو (کلاس ، اینترفیس ، ساختار ، ...) در دات نت ایجاد کرده و اون رو توسط COM قابل استفاده کنید ، نکات زیر رو در نظر داشته باشید:
• برای کلاس هاتون اینترفیس تعریف کرده و بعد اون اینترفیس ها رو در کلاس هاتون پیاده سازی کنید. (با این که COM interop مکانیسمی برای تولید خودکار یک اینترفیس از کلاس ها داره ، اما باز بهتره که این کار رو خودتون انجام بدید)
• اون انواعی رو که می خواید توسط برنامه های COM دیده بشه ، از نوع public در نظر بگیرید.
• اعضای انواع رو (مثل متد ، فیلد ، رویداد ، پراپرتی) رو هم public کنید. به طور پیش فرض تمام انواع public (و اعضای public شون) در COM دیده میشن و قابل دسترسی ان؛ برای مخفی کردن یک نوع public (یا یک عضو public از اون نوع) از ComVisibleAttribute استفاده کنید.
• کلاس هاتون باید یک سازندۀ پیش فرض پابلیک داشته باشن (یک سازندۀ بدون آرگومان) تا در COM بشه یک نمونه از اون ها ساخت. البته اگه راه دیگری برای برگردوندن یک نمونه از یک کلاس دارید ، باز هم میشه از اون کلاس در COM استفاده کرد. کلاستون میتونه سازنده هایی با آرگومان داشته باشه ، ولی اون سازنده ها فقط در کد دات نت قابل فراخوانی هستند.
• انواعتون نباید abstract باشند
• در VB.NET از قالب COMClass استفاده کنید (Project :: Add New Item :: COMClass) استفاده از این قالب راحت ترین راه برای ایجاد کلاس هاییه که قراره توسط COM استفاده بشن (خودش یک کلاس درست می کنه که حاوی ComClassAttribute هم هست و GUID و Interface ID و Event ID تولید می کنه و شامل یک سازندۀ پابلیک پیش فرض هم هست)

ثبت یک اسمبلی دات نت برای استفاده در COM و ایجاد یک type library

برای این که بتونید در VB6 از یک کامپوننت دات نت استفاده کنید باید اسمبلی مد نظرتون رو رجیستر کرده و یک type library ایجاد کنید. عمل رجیستر کردن باید روی هر کامپیوتری که قراره یک برنامه ی COM از اسمبلی ما استفاده کنه ، انجام بشه. Type library اطلاعاتی دربارۀ نوع ها (مثلا کلاس ها)یی که در این اسمبلی وجود داره فراهم می کنه. فرایند انجام این کار بسته به این که روی سیستم خودتون انجام می گیره یا سیستم مشتری (کاربر) فرق می کنه.
روی سیستم خودتون Visual Studio به صورت خودکار یک type library ایجاد کرده و هنگام build اون رو رجیستر هم می کنه (به شرطی که در تب Compile در Properties پروژه ، گزینه ی Register for COM Interop رو تیک زده باشید. اگه از قالب COMClass استفاده می کنید ، این گزینه به صورت خودکار تیک خورده)
توجه: در سی شارپ این گزینه در تب Build قرار داره (Project Option :: Build :: Register for COM interop)
اگه روی سیستمتون Visual Studio ندارید باید type library رو به صورت دستی ایجاد و رجیستر کنید.برای این کار باید از ابزار Assembly Registration (regasm.exe) استفاده کنید. (با سویچ /TLB) اگه اسمبلی تون خصوصیه (یعنی قرار نیست برنامه ای غیر از برنامۀ خودتون ازش استفاده کنه) باید از سویچ /Codebase هم استفاده کنید. اسمبلی های خصوصی برای استفاده شدن توسط یک برنامه ایجاد شدن و دیگر برنامه ها نمی تونن ازش استفاده کنن. (و اسمبلی در فولدر خود برنامه قرار داره) در صورتی که می خواید اسمبلی توسط دیگر برنامه ها هم قابل استفاده باشه ، باید اون رو با sign کرده و در GAC نصب کنید.
برای اطلاعات بیشتر در مورد چگونگی sign کردن اسمبلی و نصبش در GAC به لینک زیر مراجعه کنید:
http://msdn2.microsoft.com/en-us/library/xc31ft41(vs.71).aspx

سویچ /tlb یک type library ایجاد کرده و نصبش می کنه و سویچ /Codebase هم به منظور رجیستر کردن مکان یک اسمبلی دات نت در رجیستری ویندوز استفاده میشه. اگر از سویچ /Codebase استفاده نمی کنید و اسمبلی رو هم در GAC نذاشتید ، باید یک کپی از اسمبلی تون رو در فولدر تمام برنامه های COM اجرایی (.exe) قرار بدید. برای ایجاد و رجیستر کردن یک type library در Command Prompt این دستور رو بنویسید:


Regasm AssemblyName.dll /tlb:FileName.tlb /codebase

ایجاد یک اسمبلی قابل استفاده در COM توسط VB.NET
1- Visual Studio رو اجرا کنید (من از نسخۀ 2008 استفاده می کنم)
2- یک پروژۀ جدید از نوع Class Library ایجاد کنید. اسمش رو بگذارید VBCOMClass و OK کنید
3- در Solution Explorer روی Class1.vb کلیک راست کرده و پاکش کنید (Delete)
4- از منوی پروژه گزینه ی Add New Item رو انتخاب کنید
5- از بخش سمت راست (Templates) COM Class رو انتخاب کرده و Add رو بزنید
این فایل جدید ، همچین شکلی داره:


<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "cfb986e8-8471-40e3-859b-e1aa03992e3f"
Public Const InterfaceId As String = "83bcb53c-6bc2-4a11-a4fc-ce266ee6de0f"
Public Const EventsId As String = "26ae1d65-5f10-4211-9325-416af9a7bcad"
#End Region

' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub

End Class

(اعداد موجود در این شکل با اعدادی که روی سیستم شما ایجاد میشن فرق می کنن)
6- تابع زیر رو به این کلاس (ComClass1) اضافه کنید:


Public Function MyAdd(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
7- در Solution Explorer روی اسم پروژه تون کلیک راست کرده و Properties رو انتخاب کنید. در قسمت Compile اطمینان حاصل کنید که گزینه ی Register for COM interop چک خورده باشه.
8- از منوی Build گزینه ی Build Solution رو انتخاب کنید تا پروژه بیلد بشه
9- VB6 رو اجرا کنید
10- از طریق File :: New Project :: Standard EXE یک پروژۀ اجرایی ایجاد کنید.
11- از منوی Project روی References کلیک کنید
12- در لیست Available References روی VBCOMClass کلیک کرده و OK کنید
13- یک Command (button) به فرم اضافه کنید
14- روی Commadn1 دابل کلیک کنید تا پنجره ی کد باز بشه
15- کد زیر رو به قسمت Command1_Click اضافه کنید:


Dim myObject As VBCOMClass.ComClass1
Set myObject = New VBCOMClass.ComClass1
MsgBox myObject.MyAdd(10, 20)
حالا برنامه رو اجرا کنید ؛ پس از کلیک دکمه ، حاصل جمع دو عدد توسط تابع موجود در DLL دات نت محاسبه شده و نشون داده میشه.
توجه: من فایل dll رو توسط VB.NET 2008 ایجاد در Vista SP1 ایجاد کرده و سپس بردمش به یک سیستم XP SP2 که در اونجا هم دات نت نصب بود و هم VB6. سپس فایلم رو (VBCOMClass.dll) در پوشه ی C ریخته و برای نصبش در سیستم از دستور زیر استفاده کردم:
regasm /TLB:COMCLASS.tlb /codebase VBCOMClass.dll

ترجمه ای آزاد از http://support.microsoft.com/default.aspx?scid=kb;en-us;817248
توجه: مثالی که استفاده کردم با مثال آورده شده در منبع کمی فرق می کنه. ضمنا انقدر کدها ساده است که نیازی به ترجمه اش به سی شارپ نبود و یک برنامه نویس سی شارپ هم دقیقا باید همین مراحل رو برای انجام این کار طی بکنه. البته در سی شارپ در Project Properties :: Application :: Assembly Information گزینه ی Make Assembly COM-Visible به طور پیش فرض چک نخورده