Chapter 2: NET Interoperability
How can we use COM Components in .NET?
.NET components communicate with COM using RCW (Runtime Callable Wrapper). Following are the ways with which you can generate RCW :
- Adding reference in Visual Studio.net. Wrapper class is generated and placed in the “BIN” directory.
- Using Type library import tool. Tlbimp.exe yourname.dll.
- Using Interopservices.System.Runtime.InteropServices namespace contains class TypeLib Converter which provides methods to convert COM classes and interface in to assembly metadata.
- Make your custom wrappers.If your COM component does not have type library then the only way to communicate is writing custom wrappers. That means communicating directly with COM components.
Once I have developed the COM wrapper do I have to still register the COM in registry?
How can we use .NET components in COM?
.NET components can not be used in straight forward way with COM. You will need to create CCW (COM Callable Wrapper) in order that COM components communicate with .NET assemblies. Following are the different approaches to implement it:
Explicitly declare interfaces.
Public Interface ICustomer Property CustomerName() As String Property CustomerCode() As String Sub AddCustomer() End Interface Public Class Customer Implements ICustomer Private PstrCustomerName As String Private PstrCustomerCode As String Public Sub AddCustomer() Implements ICustomer.AddCustomer Try ‘ addin of database code can go here Catch ex As Exception Throw ex End Try End Sub Public Property CustomerCode() As String Implements ICustomer.CustomerCode Get Return PstrCustomerCode End Get Set(ByVal value As String) PstrCustomerCode = value End Set End Property Public Property CustomerName() As String Implements ICustomer.CustomerName Get Return PstrCustomerName End Get Set(ByVal value As String) PstrCustomerName = value End Set End Property Public Sub New() End Sub End Class
The above customer class is going to be used by COM components so all the properties and methods are declared in interface and implemented in the customer class. Customer Name.Customer Code and AddCustomer are first declared in ICustomer and then implemented in Customer Class. Also note that the class must have a default constructor.
To create CCW is by using InteropServices attributes. Here interfaces are created automatically
Following are different type of class attributes :
None:No class interface is generated for the class. This is default setting when you do not specify anything.
AutoDispatch:Interface that supports IDispatch is created for the class. However, no type information is produced.
AutoDual :A dual interface is created for the class. Type information is produced and made available in the type library.
Below is an example of code that uses third attribute:
Imports System.Runtime.InteropServices _
Public Class ClsCompliant
Other than class attributes defined up there are other attributes with which you can govern other part of assembly. Example “GuidAttribute” allows you to specify the GUID, “ComVisibleAttribute” can be used to hide .NET types from COM etc.
Once .NET assembly is created using either interface or using interopservices method we need to create a COM type library using Type library export tool. Tlbexp (AssemblyName)
The final thing is registering the CCW in registry using regasm tool. regasm AssemblyName [Options]
Finally refer the TLB in your COM IDE. DLL and TLB should be in same directory where the application is executed.
Chapter 4: Remoting and Webservices
Chapter 5: Caching Concepts