|
COM and .NET in Delphi 7While putting out the new .NET infrastructure, Microsoft has tried to help companies that are continuing their existing programs. One of these migration paths is represented by the compatibility of .NET objects with COM objects. You can use an existing COM object in a .NET application, although not in the realm of managed and safe code. You can also use .NET assemblies from Windows applications as if they were native COM objects. This functionality takes place thanks to wrappers provided by Microsoft. Borland's claim to support COM/.NET interoperability in Delphi 7 is mainly a reference to the fact that COM objects compiled with Delphi won't create trouble for the .NET importer. In addition, Delphi's type library importer can work seamlessly with .NET assemblies as with standard COM libraries. Having said this, unless you have an existing large investment in COM, I'd discourage you from following this path. If you want to bet on Microsoft technologies, the future lies in native .NET solutions. If you don't like Microsoft technologies or want a cross-platform solution, COM will still be a worse choice than .NET (in the future, we may have a .NET framework for other operating systems).
To demonstrate .NET importing features, I've created a .NET library with an interface and a class implementing it. The interface and class resemble those of the FirstCom example discussed at the beginning of this chapter. Here is the code of the library, which must be compiled with the Delphi for .NET preview compiler. You must create an object, or the linker will remove almost everything from your compiled library (assembly, in .NET jargon): library NetLibrary; uses NetNumberClass in 'NetNumberClass.pas'; {$R *.res} begin // create an object to link all of the code TNumber.Create; end. The code is in the NetNumberClass unit, which defines an interface and a class implementing it: type INumber = interface function GetValue: Integer; procedure SetValue (New: Integer); procedure Increase; end; TNumber = class(TObject, INumber) private fValue: Integer; public constructor Create; function GetValue: Integer; procedure SetValue (New: Integer); procedure Increase; end; Notice that, unlike a COM server, the interface doesn't require a GUID, following .NET rules (although it can have one using an attribute of the GuidAttribute class). The system will generate one for you. After compiling this code (available in the NetImport folder of this chapter's code) with Delphi for .NET Preview (not with Delphi 7!), you need to perform two steps: First, run Microsoft's .NET Framework Assembly Registration Utility, regasm; second, run Borland's Type Library Importer, tlibimp. (In theory, you should be able to skip this step and directly use the Import Type Library dialog box, but with some libraries the use of the tlibimp program is required.) In practice, go to the folder where you've compiled the library and type from the command line the two commands in bold (you should see the rest of the text I've captured here): C:\md7code\NetImport>regasm netlibrary.dll Microsoft (R) .NET Framework Assembly Registration Utility 1.0.3705.0 Copyright (C) Microsoft Corporation 1998-2001. All rights reserved. Types registered successfully C:\md7code\NetImport>tlibimp netlibrary.dll Borland TLIBIMP Version 7.0 Copyright (c) 1997, 2002 Borland Software Corporation Type library loaded .... Created E:\books\md7code\12\NetImport\mscorlib_TLB.dcr Created E:\books\md7code\12\NetImport\mscorlib_TLB.pas Created E:\books\md7code\12\NetImport\NetLibrary_TLB.dcr Created E:\books\md7code\12\NetImport\NetLibrary_TLB.pas The effect is to create a unit for the project's type library and a unit for the imported Microsoft .NET Core Library (mscorlib.dll). Now you can create a new Delphi 7 application (a standard Win32 program) and use the .NET objects as if they were COM objects. Here is the code from the NetImport example, shown in Figure 12.14: uses NetLibrary_TLB; procedure TForm1.btnAddClick(Sender: TObject); var num: INumber; begin num := CoTNumber.Create as INumber; num.Increase; ShowMessage (IntToStr (num.GetValue)); end; |
|
Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi Programming Guide |
|