Gọi một NET Component từ một COM Component

Một phần của tài liệu Một số mẹo hay trong lập trình (Trang 44 - 48)

Trong hôm nay i-Today sẽ tạo một dự án demo để làm rõ các gọi .NET Component từ COM client.

Bước 1:

Tạo một Strong Namecho .NET Component (Strong name là một tên không trùng được tạo bởi hashing một khoá 128 bit và tên của Assembly (chúng ta đặt tên là COMInterOp)). Để tạo Strong name bạn dùng tool sn.

Để tạo một tập tin khoá tên là COMInterOp.snk, bạn thực hiện dòng lệnh:

sn -k COMInterOp.snk

Bước 2:

Bây giờ chúng ta sẽ tạo một .NET Assembly chỉ bao gôgm một class CEmp với các thuộc tính (FirstName, LastName, DOB) và phát sinh các sự kiện.

Sau đây là dòng lệnh để tạo một assembly sử dụng strong name

vbc /out:COMInterOp.dll /t:library /keyfile:COMInterOp.snk CEmp.vb

VB.NET CEmp class code

ImportsSystem

ImportsMicrosoft.VisualBasic

ImportsSystem.Runtime.InteropServices

<InterfaceTypeAttribute(ComInterfaceTypẹInterfaceIsIDispatch)> _

PublicInterface evtSenior Sub Senior()

EndInterface

<ComSourceInterfacesAttribute(''evtSenior'')> _

PublicClass CEmp

Private mstrFirstName AsString

Private mstrLastName AsString

Private mdtDOB As Date PublicEvent Senior()

PublicProperty FirstName() AsString

Get

FirstName = mstrFirstName EndGet

Set(ByVal Value AsString) mstrFirstName = Value EndSet

EndProperty

Get

LastName = mstrLastName EndGet

Set(ByVal Value AsString) mstrLastName = Value EndSet

EndProperty

PublicProperty DOB() As Date Get

DOB = mdtDOB EndGet

Set(ByVal Value As Date) mdtDOB = Value

If DateDiff(DateInterval.Year, Value, Now) > 60 Then

RaiseEvent Senior() EndIf EndSet EndProperty EndClass Bước 3:

Một khi assembly được tạo chúng ta tạo một Type librảy để COM Client có thể sử dụng Assemblỵ Chúng ta theo các option sau cho COM:

Type Library Exporter

Sử dụng Type Library Exporter (Tlbexp.exe) các lớp và giao diện (interface) được chứa trong một assembly được chuyển thành dạng một COM Lib. Một khi TypeLib được tạo, COM client có thể tạo một instance của các lớp .NET và gọi các phương thức như chúng là một đối tượng COM.

TypeLibConverter Class

TypeLibConverter Class của System.RuntimẹInteropServices namespace cung cấp các phương thức để chuyển một assembly thành một TypeLib.

Assembly Registration Tool

Assembly Registration Tool (Regasm.exe), đọc metadata trong một assembly và thêm các mục cần thiết vào registrỵ Assembly Registration tool có thể generate và đăng ký một loại thư viện khi bạn sử dụng /tlb: option. COM clients yêu cầu các loại thư viện đó khi cài đạt vào trong Windows registrỵ Nếu không sử dụng option này, Regasm.exe chỉ đăng kýnhư là một assembly, không như type librarỵ

The .NET Services Installation Tool (Regsvcs.exe) (xem thêm MSDN )

Trong ví dụ của chúng ta sẽ sử dụng RegAsm.exe để tạo TypeLib từ các class và Interface được định nghĩa trong COMInterOp.dll.

regasm ComInterOp.dll /tlb:ComInterOp.tlb

Bước 4:

Bây giờ .NET component (COMInterOp.dll) nên được cài vào GAC (global assembly cache) để làm việc với COM Code

dir>Gacutil -i COMInterOp.dll

COM Component

'Class Emps OptionExplicit

Private Emps As Scripting.Dictionary

PrivateSub Class_Initialize()

Set Emps = New Scripting.Dictionary Dim objEmp As CEmp

Set objEmp = New CEmp

objEmp.InitMe ''John'', ''Doé', ''01/01/1970''

Emps.Ađ 0, objEmp Set objEmp = New CEmp

objEmp.InitMe ''Miké', ''Edwards'', ''01/01/1941''

Emps.Ađ 1, objEmp Set objEmp = New CEmp

objEmp.InitMe ''Debrá', ''Bunn'', ''01/01/1930''

Emps.Ađ 2, objEmp

EndSub

PublicFunction PrintEmps() AsString

PrintEmps = PrintBool(True) & PrintBool(False)

EndFunction

PublicFunction PrintBool(ByVal xblnSeniors AsBoolean) AsString

Dim intCount AsInteger

Dim objEmp As CEmp Dim strPrint AsString

For intCount = 0 To Emps.Count - 1 Set objEmp = Emps(intCount)

If xblnSeniors = objEmp.IsSenior Then

strPrint = strPrint & PrintEmp(objEmp) & Chr(13) EndIf

Next intCount PrintBool = strPrint

EndFunction

PrivateFunction PrintEmp(ByVal xobjEmp As CEmp) AsString

Dim strPrint AsString

strPrint = xobjEmp.FirstName & Chr(9) & xobjEmp.LastName PrintEmp = strPrint

EndFunction 'End Class Emps 'Class Emp OptionExplicit

Private mblnIsSenior AsBoolean

Private WithEvents mobjEmp As ComInterOp.CEmp

PublicSub InitMe(ByVal xstrFName AsString, _ ByVal xstrLName AsString, ByVal xdtDOB AsDate) Set mobjEmp = New ComInterOp.CEmp

With mobjEmp .FirstName = xstrFName .LastName = xstrLName .DOB = xdtDOB EndWith EndSub

PublicPropertyGet FirstName() AsString

FirstName = mobjEmp.FirstName

EndProperty

PublicPropertyGet LastName() AsString

LastName = mobjEmp.LastName

EndProperty

PublicPropertyGet IsSenior() AsBoolean

IsSenior = mblnIsSenior

EndProperty

PrivateSub mobjEmp_Senior() mblnIsSenior = True

EndSub

'End Class Emp

Xuất(Generate) động (Dynamically ) tập tin PDF sử dụng ASP.NET

Hiện nay có rất nhiều cách để xuất động các tập tin PDF. Cách phổ biến được biết là sử dụng ASP với Acrobat Full Vesion (4.0 hoặc 5.0) và Acrobat FDF Toolkit. Với Microsoft.NET rất nhiều lập trình viên đang lúng túng để thực hiện công việc nàỵ i-Today xin hướng dẫn các bạn cách làm.

Các công cụ

1. Adobe Acrobat 5.0 Full Version, không phải Acrobat Reader 5.0

2. Acrobat FDF Toolkit Version 5, free downloaded

3. Microsoft .NET Framework SDK with Service Pack 1 Platform

Windows 2000 Server (Service Pack 2), Internet Information Server 5.0 Cài đặt

1. Cài đặt Adobe Acrobat 5.0 Full Version.

2. Go to http://partners.adobẹcom/asn/developer/acrosdk/forms.html để download the Acrobat FDF Toolkit packagẹ

3. Cài đặt theo hướng dẫn http://partners.adobẹcom/asn/developer/acrosdk/docs/fdftk/FDFtkRef.pdf. Giản nén Acrobat FDF Toolkit package, tìm files: FdfAcX.dll và FdfTk.dll. Chép vào thư

mục \WINNT\system32 , và đăng ký Regsvr32 FdfAcX.dll.

4. Tạo .NET compatible wrapper cho FdfAcX.dll dùng TlbImp.exe(Type Library Importer). Trong cửa sổ Command Window, đánh:

tlbimp FdfAcX.dll /out:FdfAcX_NET.dll

5. Đặt FdfAcx_NET.dll đã được generated CLR assembley vào thư mục bin của chương trình của bạn. Nên nhớ

các tập tin được gen bởi Tlbimp.exe cần đặt trong thư mục chương trình\bin của ASP.NET. Trong ASP, dùng VBScript

Set FdfAcX = Server.CreateObject(FdfApp.FdfApp) FdfAcX.FDFSetFile http://www.yourserver.com/test.pdf FdfAcX.FDFSetValue txtMemo, This is a test, false FdfAcX.FDFSaveToFile C:\temp\test.fdf

FdfAcX.FDFClose Set FdfAcX = nothing

ASP.NET

<%@ Import Namespace=FdfAcX_NET %> FdfAppClass FdfAcX_App = new FdfAppClass();

FdfDoc FdfAcX_Doc = (FdfDoc)FdfAcX_App.FDFCreate(); FdfAcX_Doc.FDFSetFile(http://www.yourserver.com/test.pdf); FdfAcX_Doc.FDFSetValue(txtMemo, This is a test, false); FdfAcX_Doc.FDFSaveToFile(@c:\temp\test.fdf);

FdfAcX_Doc.FDFClose();

VB.NET:

Dim FdfAcX_App As FdfAppClass FdfAcX_App = new FdfAppClass() Dim FdfAcX_Doc As FdfDoc

FdfAcX_Doc = FdfAcX_App.FDFCreate

FdfAcX_Doc.FDFSetFile(http://www.yourserver.com/test.pdf) FdfAcX_Doc.FDFSetValue(txtMemo, This is a test , false) FdfAcX_Doc.FDFSaveToFile(c:\temp\test.fdf)

FdfAcX_Doc.FDFClose

Truyền file được gen đến người sử dụng

<script language=C# runat=server>

protected void Page_Load(Object Src, EventArgs E) { if (!IsPostBack) { ResponsẹContentType=Application/vnd.fdf; ResponsẹWriteFile(@c:\temp\test.fdf); ResponsẹEnd(); } }

Một phần của tài liệu Một số mẹo hay trong lập trình (Trang 44 - 48)

Tải bản đầy đủ (PDF)

(79 trang)