1 / 57

Interoperability Strategies With a pinch of migration and performance

Agenda. Introduction.NET Using COM COM Using .NETPlatform InvokeInteroperating with JVMRevisiting the VB.NET Upgrade WizardPerformance, Pitfalls and Best Practices. Introduction. Preserve investment in existing codeNo need to start overUse existing COM components and COM servicesIncrementa

muireann
Download Presentation

Interoperability Strategies With a pinch of migration and performance

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    2. .NET Interoperability Strategies With a pinch of migration and performance Name Title Company

    3. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with JVM Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    4. Introduction Preserve investment in existing code No need to start over Use existing COM components and COM+ services Incremental approach to .Net adoption Introduce .NET into your app step-by-step Unmanaged apps will exits for years to come Still need to use managed components Office, Internet Explorer, Windows® Shell, ASP Some code can’t change KEY MESSAGE: The need for interop SLIDE BUILDS: None SLIDE SCRIPT: Microsoft recognizes that not all code will be re-written at native .NET code overnight. In fact, many Microsoft products will carry COM objects for quite some time. Therefore, it’s critical that .NET code can talk to COM code, and that COM code can talk to .NET code. Interop lets you preserve your existing investment in COM. Interop also lets you migrate to .NET one piece at a time. You don’t need to port the whole application, you can work project-by-project. In addition, Microsoft has provided a rich feature set for enterprise applications called COM+, and .NET lets you leverage every aspect of this. SLIDE TRANSISTION: How managed and unmanaged code compare. KEY MESSAGE: The need for interop SLIDE BUILDS: None SLIDE SCRIPT: Microsoft recognizes that not all code will be re-written at native .NET code overnight. In fact, many Microsoft products will carry COM objects for quite some time. Therefore, it’s critical that .NET code can talk to COM code, and that COM code can talk to .NET code. Interop lets you preserve your existing investment in COM. Interop also lets you migrate to .NET one piece at a time. You don’t need to port the whole application, you can work project-by-project. In addition, Microsoft has provided a rich feature set for enterprise applications called COM+, and .NET lets you leverage every aspect of this. SLIDE TRANSISTION: How managed and unmanaged code compare.

    5. Introduction A Bridge Between Two Models Unmanaged Code Type libraries Immutable Type unsafe Interface-based HResults Guids Managed Code Assemblies Resilient bind Type safe Object-based Exceptions Strong names KEY MESSAGE: How managed and unmanaged code compare. SLIDE BUILDS: None SLIDE SCRIPT: When you get to the component level, managed and unmanaged code are completely different. Unmanaged code packages everything into a DLL or EXE that’s described by a type library. In the .NET world, this format for DLLs and EXEs are completely different. In .NET, these are called assemblies, and they contain meta-data (called a manifest) that describes the contents. COM expects interfaces to be immutable, which was not realistic. .NET uses a more flexible model called “resilient bind” where components can change, but keep the same name. Existing clients can continue to use the new component based on more flexible versioning rules. Unmanaged code provided no type checking on pointer types. In .NET everything is type-safe. Unmanaged code always dealt with object through interfaces. In .NET, a class isn’t required to implement interfaces (no more IUnknown). COM returned error information using an HRESULT. .NET uses a much richer Exception model. Finally, COM used a GUID to uniquely identify a component. In .NET, not all components are required to have a unique ID. If one is desired, you generate a strong name, which includes the name of the assembly, it’s version, and a public key token. It’s the role of interop to abstract the differences between these models so that you, as the developer, don’t have to deal with each of these. SLIDE TRANSISTION: You can get to .NET from COM; You can get to COM from .NET ADDITIONAL INFORMATION FOR PRESENTER: Introduction Old versus .NET Type definitions If you are accustomed to working with type libraries, you know that they contain public types only. Moreover, a type library is optional unless in the managed programming model, where type information is mandatory. Interoperation services provide tools that convert type libraries to metadata in assemblies and metadata to type libraries. Types vary between managed and unmanaged code, but also among languages. Versioning COM interfaces are immutable. If you change an interface, you must rename it with a new GUID. Managed types can evolve while maintaining the same name. Type safety Unmanaged compilers provide no type checking on pointer types, making the code susceptible to malicious activity. In general, managed code requires a higher level of trust. Programmers can continue to use pointers in managed code, although the code has restrictions because of its unsafe behavior. Interoperation services prevent non-trusted, managed code from accessing unmanaged code. Error-handling mechanisms COM methods usually return an HRESULT, indicating that the call succeeded or failed. Managed code incorporates exceptions. By default, COM Interop maps managed exceptions to failure HRESULTs. GUIDs Identify a specific unmanaged type and provide no location information on that type. Strong names consist of a unique assembly name in addition to a type name. Because the assembly name uniquely identities the type, you can reuse a type name across multiple assemblies. An assembly also introduces publisher key, version, and location information to a managed type. Interoperation services generate GUIDs and are strong-named as required. KEY MESSAGE: How managed and unmanaged code compare. SLIDE BUILDS: None SLIDE SCRIPT: When you get to the component level, managed and unmanaged code are completely different. Unmanaged code packages everything into a DLL or EXE that’s described by a type library. In the .NET world, this format for DLLs and EXEs are completely different. In .NET, these are called assemblies, and they contain meta-data (called a manifest) that describes the contents. COM expects interfaces to be immutable, which was not realistic. .NET uses a more flexible model called “resilient bind” where components can change, but keep the same name. Existing clients can continue to use the new component based on more flexible versioning rules. Unmanaged code provided no type checking on pointer types. In .NET everything is type-safe. Unmanaged code always dealt with object through interfaces. In .NET, a class isn’t required to implement interfaces (no more IUnknown). COM returned error information using an HRESULT. .NET uses a much richer Exception model. Finally, COM used a GUID to uniquely identify a component. In .NET, not all components are required to have a unique ID. If one is desired, you generate a strong name, which includes the name of the assembly, it’s version, and a public key token. It’s the role of interop to abstract the differences between these models so that you, as the developer, don’t have to deal with each of these. SLIDE TRANSISTION: You can get to .NET from COM; You can get to COM from .NET ADDITIONAL INFORMATION FOR PRESENTER: IntroductionOld versus .NET Type definitions If you are accustomed to working with type libraries, you know that they contain public types only. Moreover, a type library is optional unless in the managed programming model, where type information is mandatory. Interoperation services provide tools that convert type libraries to metadata in assemblies and metadata to type libraries. Types vary between managed and unmanaged code, but also among languages. Versioning COM interfaces are immutable. If you change an interface, you must rename it with a new GUID. Managed types can evolve while maintaining the same name. Type safety Unmanaged compilers provide no type checking on pointer types, making the code susceptible to malicious activity. In general, managed code requires a higher level of trust. Programmers can continue to use pointers in managed code, although the code has restrictions because of its unsafe behavior. Interoperation services prevent non-trusted, managed code from accessing unmanaged code. Error-handling mechanisms COM methods usually return an HRESULT, indicating that the call succeeded or failed. Managed code incorporates exceptions. By default, COM Interop maps managed exceptions to failure HRESULTs. GUIDs Identify a specific unmanaged type and provide no location information on that type. Strong names consist of a unique assembly name in addition to a type name. Because the assembly name uniquely identities the type, you can reuse a type name across multiple assemblies. An assembly also introduces publisher key, version, and location information to a managed type. Interoperation services generate GUIDs and are strong-named as required.

    6. Introduction Bi-directional COM Interop .NET Using COM Allows .NET types to access COM types COM Using .NET Allows COM types to access .NET types KEY MESSAGE: You can get to .NET from COM; You can get to COM from .NET SLIDE BUILDS: None SLIDE SCRIPT: If you decide not to upgrade, Microsoft enables you to use your existing code through COM Interop. One of the primary goals of the .NET Framework is to make COM development easier since one of the hardest things about COM development is dealing with the COM infrastructure. Consequently, to make COM development easier, the .NET Framework automates virtually all of what developers currently think of as COM, including reference-counting, interface description and registration. A COM developer using Visual Studio 6® could call a .NET Framework component and, to the developer, it would look like a COM component, complete with unknown data. Conversely, a .NET Framework developer using Visual Studio® .NET would see a COM component as a .NET Framework class. There is a caveat to this relationship. COM developers must manually do many of the things that .NET Framework developers can rely on the CLR to automate for them. For example, the security of a COM component must be written manually, and its memory can’t be automatically managed, and, to install a COM component, entries must be placed in the Windows registry. For .NET Framework components, the CLR automates these features. Components are self-describing, for example, and can therefore be installed without registering them in the Windows registry. The CLR provides a common type system where applications can be written in multiple languages using closer integration than before. For example, a class written in Visual C#™ can be inherited by a class written in Visual Basic. A set of services are provided in the form of class libraries. These provide the developer with encapsulated functionality such as Web services and SOAP along with the services provided by Windows and COM+. Interop is a stop-gap. It isn’t used as a replacement for creating a new managed Object model. COM Interop fails to provide many of the benefits of .NET. There are no parameterized constructs, inheritance, deployment, versioning support, zero-impact deployment, etc. It simply lets you get access to the stuff you have today. SLIDE TRANSISTION: The Runtime Callable Wrapper KEY MESSAGE: You can get to .NET from COM; You can get to COM from .NET SLIDE BUILDS: None SLIDE SCRIPT: If you decide not to upgrade, Microsoft enables you to use your existing code through COM Interop. One of the primary goals of the .NET Framework is to make COM development easier since one of the hardest things about COM development is dealing with the COM infrastructure. Consequently, to make COM development easier, the .NET Framework automates virtually all of what developers currently think of as COM, including reference-counting, interface description and registration. A COM developer using Visual Studio 6® could call a .NET Framework component and, to the developer, it would look like a COM component, complete with unknown data. Conversely, a .NET Framework developer using Visual Studio® .NET would see a COM component as a .NET Framework class. There is a caveat to this relationship. COM developers must manually do many of the things that .NET Framework developers can rely on the CLR to automate for them. For example, the security of a COM component must be written manually, and its memory can’t be automatically managed, and, to install a COM component, entries must be placed in the Windows registry. For .NET Framework components, the CLR automates these features. Components are self-describing, for example, and can therefore be installed without registering them in the Windows registry. The CLR provides a common type system where applications can be written in multiple languages using closer integration than before. For example, a class written in Visual C#™ can be inherited by a class written in Visual Basic. A set of services are provided in the form of class libraries. These provide the developer with encapsulated functionality such as Web services and SOAP along with the services provided by Windows and COM+. Interop is a stop-gap. It isn’t used as a replacement for creating a new managed Object model. COM Interop fails to provide many of the benefits of .NET. There are no parameterized constructs, inheritance, deployment, versioning support, zero-impact deployment, etc. It simply lets you get access to the stuff you have today. SLIDE TRANSISTION: The Runtime Callable Wrapper

    7. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with Java Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    8. .NET Using COM KEY MESSAGE: The Runtime Callable Wrapper SLIDE BUILDS: 3 SLIDE SCRIPT: BUILD A .NET Cient accesses a COM server… BUILD …through a Runtime Callable Wrapper. The RCW is responsible for handling all interaction between the .NET Client code and the COM component, including (but not limited to): Creating and binding to the underlying COM object, Consuming COM interfaces and factoring the interfaces into a managed form. Translating and marshaling data between environments. Managing the lifetime of the wrapped COM object. Translating COM HRESULT values into .NET exceptions BUILD The RCW is a managed object and is allocated from the heap maintained by the CLR. As with any other managed Object, references to the RCW are traced by the CLR and the RCW is subject to garbage collection. SLIDE TRANSISTION: Calling COM from .NETKEY MESSAGE: The Runtime Callable Wrapper SLIDE BUILDS: 3 SLIDE SCRIPT: BUILD A .NET Cient accesses a COM server… BUILD …through a Runtime Callable Wrapper. The RCW is responsible for handling all interaction between the .NET Client code and the COM component, including (but not limited to): Creating and binding to the underlying COM object, Consuming COM interfaces and factoring the interfaces into a managed form. Translating and marshaling data between environments. Managing the lifetime of the wrapped COM object. Translating COM HRESULT values into .NET exceptions BUILD The RCW is a managed object and is allocated from the heap maintained by the CLR. As with any other managed Object, references to the RCW are traced by the CLR and the RCW is subject to garbage collection. SLIDE TRANSISTION: Calling COM from .NET

    9. .NET Using COM Using COM Types from .NET Create an assembly containing type definitions for COM types By using type library importer (TlbImp) TlbImp MyLib.tlb /out:MyLib.Dll By adding references in Visual Studio® Use the types as managed types Create instances with new Throw and catch exceptions KEY MESSAGE: Calling COM from .NET SLIDE BUILDS: None SLIDE SCRIPT: The runtime requires metadata for all types, including COM types, in most situations. The TlbImp utility included in the SDK can convert COM type libraries to .NET Framework metadata. Once the type library is converted to metadata, managed clients can call the COM type seamlessly. For ease of use, always provide type information in a type library. Adding a reference to a tlb in Visual Studio does the same thing as tlbimp. These really do appear to your .NET code as managed types, so you instantiate them with New. Instead of returning HRESULTs, they throw exceptions. SLIDE TRANSISTION: Installing interop assemblies. KEY MESSAGE: Calling COM from .NET SLIDE BUILDS: None SLIDE SCRIPT: The runtime requires metadata for all types, including COM types, in most situations. The TlbImp utility included in the SDK can convert COM type libraries to .NET Framework metadata. Once the type library is converted to metadata, managed clients can call the COM type seamlessly. For ease of use, always provide type information in a type library. Adding a reference to a tlb in Visual Studio does the same thing as tlbimp. These really do appear to your .NET code as managed types, so you instantiate them with New. Instead of returning HRESULTs, they throw exceptions. SLIDE TRANSISTION: Installing interop assemblies.

    10. .NET Using COM Installing Interop Assemblies Assembly with COM type definitions must be resolvable at runtime Installed in the application directory Copy assembly along with the application file Installed in the Global Assembly Cache Generate key file using Sn.exe Sign the assembly using TlbImp C:\>TlbImp MyLib.tlb /keyfile:MyKey.snk Install using gacutil.exe KEY MESSAGE: Installing interop assemblies. SLIDE BUILDS: None SLIDE SCRIPT: When you create the runtime callable wrapper, it is packaged into its own assembly. This assembly must be shipped with your application. It can be a “private” assembly, meaning that it’s just in the folder structure of your application, and is just copied along with your application when it installs. However, if many applications are going to use the same RCW, the you can install it in the global assembly cache. To place an assembly in the GAC, it has to have a “strong name”. You do this by generating a key file using the SN utility, then you use TlbImp to sign the assembly with the key. At this point, you can use gacutil to install the assembly in the GAC. SLIDE TRANSISTION: Demo KEY MESSAGE: Installing interop assemblies. SLIDE BUILDS: None SLIDE SCRIPT: When you create the runtime callable wrapper, it is packaged into its own assembly. This assembly must be shipped with your application. It can be a “private” assembly, meaning that it’s just in the folder structure of your application, and is just copied along with your application when it installs. However, if many applications are going to use the same RCW, the you can install it in the global assembly cache. To place an assembly in the GAC, it has to have a “strong name”. You do this by generating a key file using the SN utility, then you use TlbImp to sign the assembly with the key. At this point, you can use gacutil to install the assembly in the GAC. SLIDE TRANSISTION: Demo

    11. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works.

    12. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with JVM Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    13. COM Using .NET Interoperability KEY MESSAGE: How interoperability works. SLIDE BUILDS: 8 SLIDE SCRIPT: BUILD You can call a .NET object from a COM application. BUILD To the COM application, it appears that it’s calling a COM object directly. BUILD It’s actually calling the .NET object through a COM Callable Wrapper which is created using a utility called TlbExp.exe. BUILD The CCW is an unmanaged COM Object. It is allocated from the standard Windows heap and is reference counted similar to a traditional COM Object. It is not garbage collected, but is destroyed upon release of the last client reference. When the CCW is destroyed, the managed Object that it wraps is marked for garbage collection. BUILD The CCW exposes the standard IUnknown Interface. BUILD It also exposes IDispatch so that the object is accessible from scripting languages. BUILD And the class itself is exposed through a COM interface. If the class implemented .NET interfaces, those would be exposed as well. BUILD From the outside, it’s a full COM object, with reference counting, and all the other features that you would expect. SLIDE TRANSISTION: Steps to call .NET from COMKEY MESSAGE: How interoperability works. SLIDE BUILDS: 8 SLIDE SCRIPT: BUILD You can call a .NET object from a COM application. BUILD To the COM application, it appears that it’s calling a COM object directly. BUILD It’s actually calling the .NET object through a COM Callable Wrapper which is created using a utility called TlbExp.exe. BUILD The CCW is an unmanaged COM Object. It is allocated from the standard Windows heap and is reference counted similar to a traditional COM Object. It is not garbage collected, but is destroyed upon release of the last client reference. When the CCW is destroyed, the managed Object that it wraps is marked for garbage collection. BUILD The CCW exposes the standard IUnknown Interface. BUILD It also exposes IDispatch so that the object is accessible from scripting languages. BUILD And the class itself is exposed through a COM interface. If the class implemented .NET interfaces, those would be exposed as well. BUILD From the outside, it’s a full COM object, with reference counting, and all the other features that you would expect. SLIDE TRANSISTION: Steps to call .NET from COM

    14. COM Using .NET Using .NET Types from COM Create, manage type in the usual way Only the public are exposed to COM Classes must have default ctor to be creatable Use TlbExp to create COM type library Register the assembly with RegAsm Only needed for Interop Reference the typelib as necessary Use the types as normal COM types KEY MESSAGE: Steps to call .NET from COM SLIDE BUILDS: None SLIDE SCRIPT: The steps for using a .NET class from COM are pretty straight-forward. You create a .NET class, just as you normally would. Only things that are public will be exposed to COM. In addition, any classes that you want to call from COM must provide a default constructor (a constructor that takes no arguments). You then use TlbExp.exe to create a type library. This type library is registered using the RegAsm utility. At this point the .NET class looks just like a COM object to the outside world. You can reference the typelib just as you normally would. And the .NET types appear as COM types. SLIDE TRANSISTION: Demo ADDITIONAL INFORMATION FOR PRESENTER: COM Using .NET Using .NET Types from COM KEY MESSAGE: Steps to call .NET from COM SLIDE BUILDS: None SLIDE SCRIPT: The steps for using a .NET class from COM are pretty straight-forward. You create a .NET class, just as you normally would. Only things that are public will be exposed to COM. In addition, any classes that you want to call from COM must provide a default constructor (a constructor that takes no arguments). You then use TlbExp.exe to create a type library. This type library is registered using the RegAsm utility. At this point the .NET class looks just like a COM object to the outside world. You can reference the typelib just as you normally would. And the .NET types appear as COM types. SLIDE TRANSISTION: Demo ADDITIONAL INFORMATION FOR PRESENTER: COM Using .NETUsing .NET Types from COM

    15. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works.

    17. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with JVM Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    18. Platform Invoke (P/Invoke) Provides access to static entry points in unmanaged DLLs (Win32® API) Similar to: Visual Basic® Declare statement LoadLibrary/GetProcAddress C# requires a method definition with a custom attribute (Visual Basic uses Declare) Uses the same underlying marshalling service as COM Interop KEY MESSAGE: Calling API functions SLIDE BUILDS: None SLIDE SCRIPT: Platform Invoke is typically used to call Win32 API functions. Here, you’re not dealing with COM objects, but C style functions. You add either an attribute, or a declare statement to your .NET code (depending on whether you’re using C# or VB), then you can just call the method. It uses the same underlying service to marshal data-types as COM. SLIDE TRANSISTION: How we got here KEY MESSAGE: Calling API functions SLIDE BUILDS: None SLIDE SCRIPT: Platform Invoke is typically used to call Win32 API functions. Here, you’re not dealing with COM objects, but C style functions. You add either an attribute, or a declare statement to your .NET code (depending on whether you’re using C# or VB), then you can just call the method. It uses the same underlying service to marshal data-types as COM. SLIDE TRANSISTION: How we got here

    23. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works.

    24. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with JVM Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    25. Interoperating CLR and JVM Two different Virtual Machines; different execution approaches IL doesn’t understand Bytecode and vice-versa No defined APIs for interoperability Implementations are two different specifications altogether!

    26. Interoperating CLR and JVM: WebServices WebServices are based upon an Internet standard Everyone conforms to SOAP Implementation-wise Parsing Packaging Still, some specifics require the need to customize the web-service proxies Good for loosely coupled systems

    27. Interoperating CLR and JVM: Products Borland’s Janeva http://www.borland.com/janeva/ Intrinsyc’s Ja.NET http://j-integra.intrinsyc.com/ja.net/info/ Both allow .NET apps to talk with J2EE applications and vice-versa No changes required in the source code at either side!

    28. Interoperating CLR and JVM: Ja.NET Overview

    29. Interoperating CLR and JVM: Ja.NET Features Supports tightly coupled systems Talks Microsoft .NET remoting protocol from pure Java (binary/soap format, http/tcp channels) Pass objects by reference Support for events Transparently maps .NET Collections to Java collections (and the reverse)

    30. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works. KEY MESSAGE: Demonstration SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: How interoperability works.

    31. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with JVM Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    32. Using the VB.NET Upgrade Wizard No Side-by-Side Issues IDEs can be installed on same machine Separate directories Install order is irrelevant Doesn’t affect Microsoft® ActiveX® Can run Visual Basic 6 while upgrading KEY MESSAGE: Visual Basic 6 and Visual Studio .NET work side-by-side without any problems. SLIDE BUILDS: None SLIDE SCRIPT: Both IDEs install to separate directories and can run on the same machine without a hitch. The order of installation of the two IDEs also does not matter. ActiveX controls and libraries installed with Visual Basic 6 also are left undisturbed; and you can even leave Visual Basic 6 running while you upgrade because the Upgrade Wizard does not alter the original source files. Rather, it copies and places them in a new folder that you specify. SLIDE TRANSITION: The Upgrade Wizard has a particular philosophy that guides how it operates. ADDITIONAL INFORMATION FOR PRESENTER: KEY MESSAGE: Visual Basic 6 and Visual Studio .NET work side-by-side without any problems. SLIDE BUILDS: None SLIDE SCRIPT: Both IDEs install to separate directories and can run on the same machine without a hitch. The order of installation of the two IDEs also does not matter. ActiveX controls and libraries installed with Visual Basic 6 also are left undisturbed; and you can even leave Visual Basic 6 running while you upgrade because the Upgrade Wizard does not alter the original source files. Rather, it copies and places them in a new folder that you specify. SLIDE TRANSITION: The Upgrade Wizard has a particular philosophy that guides how it operates. ADDITIONAL INFORMATION FOR PRESENTER:

    33. Using the VB.NET Upgrade Wizard Wizard Philosophy It’s your code Should be recognizable Comments preserved Make it viable Enough to get it to run Closest match Microsoft.VisualBasic.Compatibility.Visual Basic6 KEY MESSAGE: The basic philosophy behind the Upgrade Wizard. SLIDE BUILDS: 2 SLIDE SCRIPT: [BUILD 1] First, the Upgrade Wizard realizes that the code is yours, and you probably want it messed with as little as possible. It believes that after the upgrade your code should be fully recognizable– structured and organized as much as possible to the original, with all of your comments preserved. [BUILD 2] To this end, the wizard strives to do the minimum to just make the code work and take care of any mundane “grunt work” on your behalf. Any unnecessary changes beyond that are merely flagged as issues in the upgrade report. In this way you can retain control of your code as much as possible, and tackle the upgrade issues one by one as you see fit. The wizard will also attempt to find the closest match between Visual Basic 6 and .NET components in the interest of keeping the application’s behaviour the same. Whenever deemed most appropriate, the wizard chooses members of the Visual Basic 6 Compatibility Library over similar .NET members, which also keeps the changes to a minimum. SLIDE TRANSITION: Now that you understand the underlying upgrade philosophy, you can now better understand the wizard’s methodology. ADDITIONAL INFORMATION FOR PRESENTER: KEY MESSAGE: The basic philosophy behind the Upgrade Wizard. SLIDE BUILDS: 2 SLIDE SCRIPT: [BUILD 1] First, the Upgrade Wizard realizes that the code is yours, and you probably want it messed with as little as possible. It believes that after the upgrade your code should be fully recognizable– structured and organized as much as possible to the original, with all of your comments preserved. [BUILD 2] To this end, the wizard strives to do the minimum to just make the code work and take care of any mundane “grunt work” on your behalf. Any unnecessary changes beyond that are merely flagged as issues in the upgrade report. In this way you can retain control of your code as much as possible, and tackle the upgrade issues one by one as you see fit. The wizard will also attempt to find the closest match between Visual Basic 6 and .NET components in the interest of keeping the application’s behaviour the same. Whenever deemed most appropriate, the wizard chooses members of the Visual Basic 6 Compatibility Library over similar .NET members, which also keeps the changes to a minimum. SLIDE TRANSITION: Now that you understand the underlying upgrade philosophy, you can now better understand the wizard’s methodology. ADDITIONAL INFORMATION FOR PRESENTER:

    34. Using the Upgrade Wizard Wizard Methodology KEY MESSAGE: The methodology of the Upgrade Wizard. SLIDE BUILDS: 7 SLIDE SCRIPT: The best way to understand what goes on when you run the Upgrade Wizard is to examine the SDK upgrade documentation, the upgrade reports, and the Microsoft Press book Upgrading Microsoft Visual Basic 6 to Microsoft Visual Basic .NET. However, a brief discussion of the methodology in some key areas will give you a high-level overview in preparation for the demonstration coming shortly. [BUILD 1] In most cases, each file in a Visual Basic project retains its name. Only the file extension changes. Project files are converted from .vbp to .vbproj, and all other code files are changed to a .vb extension. The exception to this rule is when you have to code files with the same base name, for example, a Main.frm and a Main.bas, both of which should be converted to a Main.vb. In this case one of the files is renamed with its internal class name. [BUILD 2] The only global objects that are even partially upgraded are App and Screen. Others such as Printer and Clipboard will need to be upgraded manually. [BUILD 3] Class modules and user controls upgrade to an equivalent class or user control in .NET. All of the class attributes upgrade to Public, except Private, which upgrades to Friend. [BUILD 4] Visual Basic 6 intrinsic controls are mapped to their .NET equivalents. Their associated layout and design-time property settings, preserved in a special section of the .frm file in Visual Basic 6, are mapped as closely as possible to .NET equivalents and written to the InitializeComponent subroutine of the new Form. Only minor syntactical changes are made to control arrays in order to target control array classes provided in the compatibility library. After the upgrade you can convert these to intrinsic .NET controls collections.KEY MESSAGE: The methodology of the Upgrade Wizard. SLIDE BUILDS: 7 SLIDE SCRIPT: The best way to understand what goes on when you run the Upgrade Wizard is to examine the SDK upgrade documentation, the upgrade reports, and the Microsoft Press book Upgrading Microsoft Visual Basic 6 to Microsoft Visual Basic .NET. However, a brief discussion of the methodology in some key areas will give you a high-level overview in preparation for the demonstration coming shortly. [BUILD 1] In most cases, each file in a Visual Basic project retains its name. Only the file extension changes. Project files are converted from .vbp to .vbproj, and all other code files are changed to a .vb extension. The exception to this rule is when you have to code files with the same base name, for example, a Main.frm and a Main.bas, both of which should be converted to a Main.vb. In this case one of the files is renamed with its internal class name. [BUILD 2] The only global objects that are even partially upgraded are App and Screen. Others such as Printer and Clipboard will need to be upgraded manually. [BUILD 3] Class modules and user controls upgrade to an equivalent class or user control in .NET. All of the class attributes upgrade to Public, except Private, which upgrades to Friend. [BUILD 4] Visual Basic 6 intrinsic controls are mapped to their .NET equivalents. Their associated layout and design-time property settings, preserved in a special section of the .frm file in Visual Basic 6, are mapped as closely as possible to .NET equivalents and written to the InitializeComponent subroutine of the new Form. Only minor syntactical changes are made to control arrays in order to target control array classes provided in the compatibility library. After the upgrade you can convert these to intrinsic .NET controls collections.

    35. Using the Upgrade Wizard _UpgradeReport.htm KEY MESSAGE: The Upgrade Report contains a wealth of useful information. SLIDE BUILDS: None SLIDE SCRIPT: The report is added to the resulting solution as an HTML file. This report contains a wealth of useful information. The upper portion contains a table summarizing the number of global and file-specific upgrade issues it encountered. You’ll learn more about these errors and warnings in the next slide. Clicking the plus sign to the left of each file name reveals further details about each upgrade issue, including information about its severity, the location of the code that must be fixed, and a description of the issue. Especially helpful are the links in the Description column. SLIDE TRANSITION: Clicking a link opens a Help file pertaining to the upgrade issue, giving you tips on how to resolve it. ADDITIONAL INFORMATION FOR PRESENTER: KEY MESSAGE: The Upgrade Report contains a wealth of useful information. SLIDE BUILDS: None SLIDE SCRIPT: The report is added to the resulting solution as an HTML file. This report contains a wealth of useful information. The upper portion contains a table summarizing the number of global and file-specific upgrade issues it encountered. You’ll learn more about these errors and warnings in the next slide. Clicking the plus sign to the left of each file name reveals further details about each upgrade issue, including information about its severity, the location of the code that must be fixed, and a description of the issue. Especially helpful are the links in the Description column. SLIDE TRANSITION: Clicking a link opens a Help file pertaining to the upgrade issue, giving you tips on how to resolve it. ADDITIONAL INFORMATION FOR PRESENTER:

    36. Using the Upgrade Wizard EWI Comments Appear In Upgrade Report Code Types UPGRADE_ISSUE UPGRADE_TODO UPGRADE_WARNING Design Issues UPGRADE_NOTE Global Warnings KEY MESSAGE: Overview of error, warning, and issue comments. SLIDE BUILDS: 8 SLIDE SCRIPT: [BUILD 1] EWI is a collective term referring to errors, warnings, and issues encountered during an upgrade. They appear summarized in the Upgrade Report, as you have seen, and also in your code just above the line that contains the problem. The comment consists of a the description and a link to further help in the SDK documentation. Every EWI comment has an associated help file. [BUILD 2] The Upgrade Wizard can generate up to 50 EWIs of six different types. Only two of the six types show up directly in the Task List. [BUILD 3] Upgrade issues are the most serious. These refer to problems in your code that will cause a Visual Basic .NET compiler error. They must be fixed before you can build and run your project in .NET. Upgrade issues do not show up in the Task List. Instead, the problematic code appears, which is left unchanged by the wizard. [BUILD 4] Almost as severe are Upgrade To-dos. These refer to lines of code that were partially upgraded but still need some work on your part before the project will run. In the comment the wizard will do its best to indicate what you need to do to finish converting the code. Upgrade To-dos appear in the Task List. [BUILD 5] Upgrade warnings alert you to changes in the behaviour of code that does in fact upgrade. For example, in Visual Basic 6 the Dir function returns not only the list of files or directories inside a particular directory but also the current and parent directories. The .NET equivalent does not. Upgrade Warnings appear in the Task List.KEY MESSAGE: Overview of error, warning, and issue comments. SLIDE BUILDS: 8 SLIDE SCRIPT: [BUILD 1] EWI is a collective term referring to errors, warnings, and issues encountered during an upgrade. They appear summarized in the Upgrade Report, as you have seen, and also in your code just above the line that contains the problem. The comment consists of a the description and a link to further help in the SDK documentation. Every EWI comment has an associated help file. [BUILD 2] The Upgrade Wizard can generate up to 50 EWIs of six different types. Only two of the six types show up directly in the Task List. [BUILD 3] Upgrade issues are the most serious. These refer to problems in your code that will cause a Visual Basic .NET compiler error. They must be fixed before you can build and run your project in .NET. Upgrade issues do not show up in the Task List. Instead, the problematic code appears, which is left unchanged by the wizard. [BUILD 4] Almost as severe are Upgrade To-dos. These refer to lines of code that were partially upgraded but still need some work on your part before the project will run. In the comment the wizard will do its best to indicate what you need to do to finish converting the code. Upgrade To-dos appear in the Task List. [BUILD 5] Upgrade warnings alert you to changes in the behaviour of code that does in fact upgrade. For example, in Visual Basic 6 the Dir function returns not only the list of files or directories inside a particular directory but also the current and parent directories. The .NET equivalent does not. Upgrade Warnings appear in the Task List.

    37. Using the Upgrade Wizard EWI Comments - NOTES Appear In Upgrade Report Code Types UPGRADE_ISSUE UPGRADE_TODO UPGRADE_WARNING Design Issues UPGRADE_NOTE Global Warnings [BUILD 6] Design issues show up only in the summary table of the Upgrade Report. They indicate differences in the design of the form following an upgrade. A good example is a Form’s OLEDropMode property. There is no equivalent in .NET Forms, so this property is simply ignored and a design issue entered in the Upgrade Report for the given Form. [BUILD 7] Upgrade_notes appear only in the code and inform you about significant changes that were made. [BUILD 8] Global warnings appear only in the Global Issues section of the Upgrade Report. They alert you to any major issues that did not fall into one of the other categories. SLIDE TRANSITION: Clicking a Help link opens an HTML file pertaining to the upgrade issue, giving you tips on how to resolve it. ADDITIONAL INFORMATION FOR PRESENTER: [BUILD 6] Design issues show up only in the summary table of the Upgrade Report. They indicate differences in the design of the form following an upgrade. A good example is a Form’s OLEDropMode property. There is no equivalent in .NET Forms, so this property is simply ignored and a design issue entered in the Upgrade Report for the given Form. [BUILD 7] Upgrade_notes appear only in the code and inform you about significant changes that were made. [BUILD 8] Global warnings appear only in the Global Issues section of the Upgrade Report. They alert you to any major issues that did not fall into one of the other categories. SLIDE TRANSITION: Clicking a Help link opens an HTML file pertaining to the upgrade issue, giving you tips on how to resolve it. ADDITIONAL INFORMATION FOR PRESENTER:

    38. Using the Upgrade Wizard Upgrade Issue Help Files KEY MESSAGE: Help files are associated with upgrade issues to assist you in your upgrade efforts. SLIDE BUILDS: None SLIDE SCRIPT: Here is an example of a Help file, showing you the level of detail provided. The Help files first explain the problem and then suggest how to fix it in the “What to do next” section. SLIDE TRANSITION: It’s important to realize that there are five types of issues that the wizard will not warn you about. ADDITIONAL INFORMATION FOR PRESENTER: KEY MESSAGE: Help files are associated with upgrade issues to assist you in your upgrade efforts. SLIDE BUILDS: None SLIDE SCRIPT: Here is an example of a Help file, showing you the level of detail provided. The Help files first explain the problem and then suggest how to fix it in the “What to do next” section. SLIDE TRANSITION: It’s important to realize that there are five types of issues that the wizard will not warn you about. ADDITIONAL INFORMATION FOR PRESENTER:

    39. Using the Upgrade Wizard Errors not caught Dim x As New y Some type conversions Passing properties ByRef Dim x() ReDim x(5,5) Some ActiveX control behaviors KEY MESSAGE: Some errors are not caught by the Upgrade Wizard. SLIDE BUILDS: 5 SLIDE SCRIPT: The wizard fails to warn you about these issues, either because they are common issues that are rarely a problem or because they are impossible for the wizard to detect. [BUILD 1] The “As New” clause works differently in Visual Basic 6 than in Visual Basic .NET. Nevertheless, because the use of “As New” is very common, and will, in most cases, continue to work as desired, it was deemed best not to flag them as potential issues. [BUILD 2] Some of the coercions allowed in Visual Basic 6 are not allowed in Visual Basic .NET and also undetectable by the wizard during an upgrade. Fortunately, these will result in a compiler error and are easily fixed. [BUILD 3] In Visual Basic 6 if you pass a property as a ByRef parameter it will not be changed by the method being called. In fact, all properties are passed ByVal, regardless. When you upgrade, if ByRef was used in Visual Basic 6 the property will be passed ByRef, which could alter its behaviour. The wizard does not know what your original intentions were, so you will have to make force ByVal manually, if desired, by placing parentheses around the argument. [BUILD 4] Visual Basic 6 allows you to use Redim to change the number of indexes. Visual Basic .NET does not allow this. The Upgrade Wizard will not warn you about this problem, but it is easy to fix because a compiler error is generated. Simply add a comma to the Dim statement to support two indexes, and all runs fine. [BUILD 5] Finally, as mentioned early, some ActiveX controls will behave different due to differences in the hosting environment. You can find more information about this in the aforementioned Microsoft Press book, Chapters 9 and 13. SLIDE TRANSITION: This wraps up Part IV of the session slides. You will now get to see the Upgrade Wizard in action. ADDITIONAL INFORMATION FOR PRESENTER: KEY MESSAGE: Some errors are not caught by the Upgrade Wizard. SLIDE BUILDS: 5 SLIDE SCRIPT: The wizard fails to warn you about these issues, either because they are common issues that are rarely a problem or because they are impossible for the wizard to detect. [BUILD 1] The “As New” clause works differently in Visual Basic 6 than in Visual Basic .NET. Nevertheless, because the use of “As New” is very common, and will, in most cases, continue to work as desired, it was deemed best not to flag them as potential issues. [BUILD 2] Some of the coercions allowed in Visual Basic 6 are not allowed in Visual Basic .NET and also undetectable by the wizard during an upgrade. Fortunately, these will result in a compiler error and are easily fixed. [BUILD 3] In Visual Basic 6 if you pass a property as a ByRef parameter it will not be changed by the method being called. In fact, all properties are passed ByVal, regardless. When you upgrade, if ByRef was used in Visual Basic 6 the property will be passed ByRef, which could alter its behaviour. The wizard does not know what your original intentions were, so you will have to make force ByVal manually, if desired, by placing parentheses around the argument. [BUILD 4] Visual Basic 6 allows you to use Redim to change the number of indexes. Visual Basic .NET does not allow this. The Upgrade Wizard will not warn you about this problem, but it is easy to fix because a compiler error is generated. Simply add a comma to the Dim statement to support two indexes, and all runs fine. [BUILD 5] Finally, as mentioned early, some ActiveX controls will behave different due to differences in the hosting environment. You can find more information about this in the aforementioned Microsoft Press book, Chapters 9 and 13. SLIDE TRANSITION: This wraps up Part IV of the session slides. You will now get to see the Upgrade Wizard in action. ADDITIONAL INFORMATION FOR PRESENTER:

    40. Agenda Introduction .NET Using COM COM Using .NET Platform Invoke Interoperating with JVM Revisiting the VB.NET Upgrade Wizard Performance, Pitfalls and Best Practices KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop KEY MESSAGE: Agenda SLIDE BUILDS: None SLIDE SCRIPT: In this session you will learn how .NET interoperates with COM. You will also learn how to take advantage of the features offered by Enterprise Services Applications. SLIDE TRANSISTION: The need for interop

    41. Performance Best Practices Know performance goals and measure against them often Make native/managed split wisely Know interop performance basics Call Unicode API versions Make calls from right apartment STAThread attribute & Thread.ApartmentState property Only when necessary (based on measurements) make additional optimizations

    42. Interop Technologies Pitfalls CLR interop Writing p/invoke declarations for methods and structures in VB.NET or C# can be hard TlbImp.exe might produce incorrect interop assemblies if COM API is IDL based No compile time check if native API is changing C++ interop No magic; requires deep understanding of both native and managed worlds Handling AppDomain transitions is tricky today, especially for library development

    43. Interop Technologies Best Practices Use CLR interop when calling: Automation compatible COM APIs Simple flat APIs Limited number of native APIs Consider using C++ interop when developing applications and calling: IDL based COM APIs Large and/or complex native APIs Native APIs that are changing Long term direction: using C++ interop for both library and application development

    44. COM Interface Pointers Pitfalls Apartment related problems are more likely to happen Managed C++ code executes in MTA by default There is always one additional thread, finalizer thread

    45. COM Interface Pointers Best Practices Use interop templates when calling COM APIs in C++ Templates use RCW internally to get correct proxy Pick the right template for your COM API com_handle, com_handle_context_bound, com_handle_disposable, com_handle_context_bound_disposable, com_ptr

    46. COM Visibility Pitfalls Types are visible to COM by default; so what? Are they usable from COM by default? Maybe not! Default constructors supplied? All functionality in instance methods? Testing from COM done?

    47. COM Visibility .NET Framework Example System.Math Contains only static methods System.Collections.BitArray No default constructor

    48. COM Visibility Best Practices When developing library Make everything COM invisible by default Consider recompiling C++ COM clients with /clr switch No COM wrappers needed Design explicitly for COM clients (if recompilation is not an option) Build COM friendly APIs on top of managed-clients-only APIs

    49. Versioning Pitfalls AutoDual & AutoDispatch class interfaces: everything automatically callable from COM; isn’t that great?! What about next version? Ouch! COM clients are broken! Adding new methods breaks AutoDual class clients Adding new overloads breaks AutoDispatch class clients (overloads can come from base classes as well) Public structures can’t be changed at all

    50. Versioning .NET Framework System.Type was AutoDual in v1.0 _Type interface was added in order to preserve backwards compatibility [GuidAttribute("…")] [InterfaceTypeAttribute(…)] public interface _Type { String ToString(); … Guid GUID { get; } Module Module { get; } … };

    51. Versioning Best Practices When developing library Design explicitly for COM clients (if recompilation is not an option) Build COM friendly APIs on top of managed-clients-only APIs Implement interfaces explicitly Use ClassInterface.None and ComDefaultInterfaceAttribute Add new interfaces when making COM breaking changes

    52. Best Practices Review Project Design Know your options Do not rewrite for the sake of rewriting Use CLR interop or C++ interop when appropriate Be careful about performance Know your goals and measure often Make native/managed split wisely Use interop resources to get more information

    53. Summary You can call COM objects from .NET. (Unmanaged from Managed) You can call .NET classes from COM objects (Managed from Unmanaged) PInvoke is the way to talk to Win32 API Third party support allows for tightly coupled CLR/JVM interoperability KEY MESSAGE: Summary SLIDE BUILDS: None SLIDE SCRIPT: There is bi-directional interoperability between COM and .NET. You can call COM object from .NET, and you can call .NET classes from unmanaged COM applications. This is not the end of the road for enterprise services. Expect this to be greatly enhanced, and become even easier in future versions of .NET. But even today, enterprise services provides all the power of COM+ to managed applications. SLIDE TRANSISTION: Resources KEY MESSAGE: Summary SLIDE BUILDS: None SLIDE SCRIPT: There is bi-directional interoperability between COM and .NET. You can call COM object from .NET, and you can call .NET classes from unmanaged COM applications. This is not the end of the road for enterprise services. Expect this to be greatly enhanced, and become even easier in future versions of .NET. But even today, enterprise services provides all the power of COM+ to managed applications. SLIDE TRANSISTION: Resources

    54. MSDN Subscriptions THE way to get Visual Studio .NET With Visual Studio .NET we continue to have the Professional and Enterprise versions plus we are adding the Enterprise Architect version that provides the modeling and design tools for systematic design of applications. And to provide even broader coverage for developers, this month we introduced a new product line for MSDN, and announced that every version of Visual Studio .NET will have a corresponding version of MSDN, so developers will have the choice of whether to buy Visual Studio .NET – the packaged product, or MSDN – the subscription service. If asked for pricing, here are the pricing offerings for the MSDN Subscriptions: MSDN Universal $2799 new/ $2299 renewal/upgrade MSDN Enterprise $2199 new/$1599 renewal/upgrade MSDN Professional $1199 new/$899 renewal/upgrade MSDN OS $699 new/$499 renewal MSDN Library $199 new/$99 renewal Use this opportunity to discuss other MSDN offerings such as the MSDN Online website, MSDN local and national events, MSDN User Groups, the MSDN Magazine, and the MSDN Flash, etc.With Visual Studio .NET we continue to have the Professional and Enterprise versions plus we are adding the Enterprise Architect version that provides the modeling and design tools for systematic design of applications. And to provide even broader coverage for developers, this month we introduced a new product line for MSDN, and announced that every version of Visual Studio .NET will have a corresponding version of MSDN, so developers will have the choice of whether to buy Visual Studio .NET – the packaged product, or MSDN – the subscription service. If asked for pricing, here are the pricing offerings for the MSDN Subscriptions: MSDN Universal $2799 new/ $2299 renewal/upgrade MSDN Enterprise $2199 new/$1599 renewal/upgrade MSDN Professional $1199 new/$899 renewal/upgrade MSDN OS $699 new/$499 renewal MSDN Library $199 new/$99 renewal Use this opportunity to discuss other MSDN offerings such as the MSDN Online website, MSDN local and national events, MSDN User Groups, the MSDN Magazine, and the MSDN Flash, etc.

    55. Resources MSDN Articles: Microsoft® .NET/COM Migration and Interoperability Microsoft .NET and Windows XP COM+ Integration with SOAP www.gotdotnet.com msdn.microsoft.com KEY MESSAGE: Resources SLIDE BUILDS: None SLIDE SCRIPT: There have been a couple of great articles in MSDN about Enterprise Services and COM Interop. In addition, you’ll find resources on got dot net, and MSDN. SLIDE TRANSISTION: Questions KEY MESSAGE: Resources SLIDE BUILDS: None SLIDE SCRIPT: There have been a couple of great articles in MSDN about Enterprise Services and COM Interop. In addition, you’ll find resources on got dot net, and MSDN. SLIDE TRANSISTION: Questions

    56. Questions? KEY MESSAGE: SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION: KEY MESSAGE: SLIDE BUILDS: None SLIDE SCRIPT: SLIDE TRANSISTION:

More Related