An Introduction to .NET Keith Mulkey Senior Software Engineer

advertisement
An Introduction to
.NET
Keith Mulkey
Senior Software Engineer
SFA, Inc.
Agenda
What is .NET?
What is the Common Language Runtime (CLR)?
Introduction to Visual Studio 2005 and the IDE
Introduction to C#
What is .NET?
According to Microsoft, .NET is
“the Microsoft Web services strategy to
connect information, people, systems, and
devices through software”
What does this mean to the average
developer?
ABSOLUTELY NOTHING!
https://www.youtube.com/watch?v=_QVcBOu
CzRY
https://www.youtube.com/watch?v=Fpz8pAV
What is .NET to the average
developer?
A Framework that provides:
an easy to use development environment
a multitude of libraries that make our job
easier including distributed processing
cross-language interoperability
a runtime environment that will manage
resources with no assistance from us
tight integration with the operating system
easy integration of third party libraries
.NET Framework Design Features
Component (Assembly) Infrastructure
Language Integration
Distributed Computing
Simplified Development
Simplified Deployment
Reliability
Security
Component Infrastructure
.NET classes are ready to be used at the
binary level
.NET assemblies do not have to be
registered in the Windows registry
No special “plumbing” code is required
for component registration, class
factories, component lifetime or dynamic
binding
Language Integration
Language Independence vs. Language
Integration
COM supported language independence
Component can be written in any language
Component must meet COM specification rules
Supports binary reuse
DOES NOT allow COM component code reuse
DOES NOT support COM component class
extension
DOES NOT allow catching exceptions thrown by
COM component
Language Integration
Language Independence vs. Language
Integration
COM supported language independence
.NET supports language integration
Components can be written in any supported
language (C#, VB, Managed C++, J#)
The adherence to a common specification is
taken care of by .NET
DOES allow .NET component code reuse
DOES support .NET component class extension
DOES allow catching exceptions thrown by .NET
components
Language Integration
Language Independence vs. Language
Integration
COM supported language independence
.NET supports language integration
Made possible by the Common Type System
(CTS)
Everything in CTS derives from System.Object
CTS supports concepts of classes, interfaces,
delegates, reference types, and value types
CTS supports base system types such as
integer, double, string, file manipulation
Language Integration
Language Independence vs. Language
Integration
COM supported language independence
.NET supports language integration
Common Language Specification (CLS)
provides minimum set of rules
All .NET language compilers must meet CLS
and generate code that conforms to CTS
This allows different .NET languages to be used
in the same applicaton
Distributed Computing
COM supported distributed computing
using DCOM
Due to embedded IP address, DCOM
would not work through firewalls and
NAT
.NET uses industry standard SOAP to
interoperate on the Internet
.NET Remoting uses a CORBA-like
approach for distributed computing
Simplified Development
Every .NET language uses the same
library of .NET components
The API to the .NET library of
components is always the same
Integrating with .NET components is
always the same
The same IDE is used for all languages
Intellisense® works the same for all
languages
The build process is always the same
Simplified Deployment
No more “DLL Hell”
Shared DLLs are registered with the Global
Assembly Cache (GAC)
Multiple versions of the same DLL can coexist
Applications are tightly bound to a particular
DLL version
Simplified Deployment
No more “DLL Hell”
DLL Registry entries eliminated
References and dependencies stored in
DLL manifest
Private DLLs are found using logical paths
or XML based configuration files
Shared (public) DLLs are found using the
GAC
Both are found at runtime
Simplified Deployment
No more “DLL Hell”
DLL Registry entries eliminated
“Zero-Impact” installation and removal
.NET DLLs are not entered into registry
upon installation
Hence no need to remove from registry
upon uninstall
Installation and removal can be
accomplished with copy and delete
Simplified Deployment
No more “DLL Hell”
DLL Registry entries eliminated
“Zero-Impact” installation and removal
Reliability
Type safety
CLR must recognize and verify types
before they are loaded and executed
Helps prevent buffer overruns (Buffer
overflow) which can be a source of
program errors and security weaknesses
Reliability
Type safety
Common error handling
Automatic memory management
Security
.NET can protect access to specific parts
of executable code
.NET supports strong naming of
assemblies to help prevent pirating and
tampering
.NET has extensive support for all of the
major security algorithms and practices
in use today
.NET can be tightly integrated with the
Windows Active Directory
.NET Framework Architecture
Application
VEGA
.NET Framework
Web Services
Web Forms
Windows Forms
Data and XML Classes
(ADO.NET, SQL, XSLT, Xpath, XML, etc)
Framework Base Classes
(IO, string, net, security, threading, text, reflection, collections, etc.)
Common Language Runtime
(debug, exception, type checking, garbage collection, JIT compilation, etc.)
Windows Platform
What is the CLR?
The CLR is the heart and soul of the
.NET architecture
Analogous to Java’s JVM
The CLR activates objects and:
performs security checks on them
lays them out in memory
executes them
garbage collects them
The CLR vs. the JVM
Both are runtime infrastructures that
abstract the underlying platform
JVM supports any language that can be
represented in its bytecode
Java
The CLR vs. the JVM
Both are runtime infrastructures that
abstract the underlying platform
JVM supports any language that can be
represented in its bytecode
CLR supports any language that can be
represented in its Common Intermediate
Language (CIL)
C#, VB.NET, Managed C++, J#
Which is better, CLR or JVM?
Depends on who you ask
The CLR is not and never has been an
interpreter
In April 2003, a subset of the CLR known
as the Common Language Interface
(CLI) became an international standard
Projects are underway to develop CLRs
for Linux and Unix and possibly even
Mac OS X
Back to the CLR
The CLR manages the execution of code
in the .NET environment
The CLR:
loads required classes
performs Just-In-Time (JIT) compilation
enforces security
and much more…
Units of deployment are Portable
Executables (PEs) aka assemblies
PEs can be DLLs or EXEs
What is a .NET Assembly?
Assemblies consist of code and
metadata
Code in an assembly is in the form of the
Common Intermediate Language (CIL)
Metadata makes it all work together
.NET Assembly
Compilation
C#
Source Code
C#
Compiler
VB .NET
Source Code
VB .NET
Compiler
J#
Source Code
J#
Compiler
Managed C++
Source Code
Managed C++
Compiler
Perl .NET
Source Code
Perl .NET
Compiler
Cobol .NET
Source Code
Cobol .NET
Compiler
.NET
Assembly
(DLL or EXE)
CIL
and
Metadata
.NET Metadata
In .NET, metadata includes:
type definitions
version information
external assembly references
other standardized information
.NET Metadata
In .NET, metadata includes:
.NET uses metadata to describe an
assembly in detail, including:
identity description
types that it references
types that it exports
security requirements for execution
.NET Metadata
In .NET, metadata includes:
.NET uses metadata to describe an
assembly in detail.
Metadata provides enough information
for any runtime tool or program to find
out everything that is needed for
component integration
.NET Consumers of Metadata
CLR relies on metadata to support
runtime features
verification
security enforcement
cross-context (e.g., remote invocation)
marshalling
memory layout
execution
.NET Consumers of Metadata
CLR relies on metadata to support
runtime features
Class Loader of CLR uses metadata to
find and load .NET classes
JIT compiler uses metadata to compile
CIL code
Various tools use metadata to support
integration (e.g., Intellisense®)
Type Libraries on Steroids
Any application, tool, or utility that can
read metadata from a .NET assembly
can make use of that assembly.
Metadata ensures language
interoperability
Single-File & Multi-File Assemblies
Assemblies composed of a single *.dll or *.exe
are single-file assemblies
Multi-file assemblies are composed of
numerous .NET *.dlls or *.exes termed
modules
Primary module contains the assembly
manifest
Other modules contain module-level manifest
Primary module documents the set of
“secondary” modules within the assembly
The .NET Runtime Environment
The term runtime can be understood as
a collection of external services that are
required to execute a given compiled unit
of code.
MFC requires mfc42.dll
VB6 requires msvbvm60.dll
Java requires the JVM
.NET requires the CLR
The .NET CLR
Crux of the CLR is the Common Object
Runtime Execution Engine (mscoree.dll)
Compilation
C#
Source Code
C#
Compiler
VB .NET
Source Code
VB .NET
Compiler
J#
Source Code
J#
Compiler
Managed C++
Source Code
Managed C++
Compiler
Perl .NET
Source Code
Perl .NET
Compiler
Cobol .NET
Source Code
Cobol .NET
Compiler
Runtime – mscoree.dll
.NET
Assembly
(DLL or EXE)
CIL
and
Metadata
CLR
Class
Loader
JIT
Compiler
f
Platform
Dependent
Executable
Instructions
CLR Execution
VEGA
CLR’s Common Object
Runtime Execution Engine
JIT Compilation
Method
Invocation
Class Loader
(Locates class & entry point, caches type information,
allocates memory, initializes statics, instantiates object)
Verifier
(Verifies that metadata is well formed, CIL code is type safe, caches verified status)
JIT Compiler
(Occurs on a method by method basis, is optimized for host platform,
occurs on first method invocation only)
Execution Support and Management
(Garbage Collector, Security Engine, Code Manager
Exception Manager, Thread Support, etc)
Links for CLR
https://www.youtube.com/watch?v=gCHo
BJf4htg
https://www.youtube.com/watch?v=qCCp
_oXFcjM
https://www.youtube.com/watch?v=qCCp
_oXFcjM
What is C#
New programming language developed
by Microsoft for .NET
Syntax is very similar to Java
Just as Java is in many ways a cleanedup version of C++, C# can be viewed as
a cleaned-up version of Java
C# is managed code
Anatomy of a C# Program
A C# application must have one PE that
is an .exe; it can have any number of
PEs that are .dlls
By convention, C# source code files
have a .cs extension
All program logic must be contained
within a type definition
Anatomy of a C# Program
Every C# application must contain a
class defining a Main() method
Main() must be public and static
Main() typically does very little other than
start things up
Rules of the Road
Everything must exist within a
namespace
“enum”s and “struct”s can be defined
outside of a class but must be scoped within
a namespace
Object visibility should always be
specified. If one is not provided the
compiler will assign a default
Data in C#
There are NO POINTERs in C# (per se)
ALL reference type objects must be “new”ed
and are allocated on the managed heap
Objects are NEVER “delete”ed; the garbage
collector will take care of that
Scope resolution operator is always a
period (“.”) irrespective of the object’s
location (stack or heap)
Pointers can be used in “unsafe” code
sections -- but let’s not go there!
Data in C#
Class attributes are always initialized to
a safe default value
Local variables within a member scope
are not initialized
the compiler will force assignment before
they can be used
there is one exception to this
The Mother of All Objects
When you create a class that does not
explicitly specify a base class, you
implicitly derive from System.Object
System.Object provides some basic
functionality for all C# classes
Example: ToString() returns a string
representation of the given object
Some functionality can be overridden:
Equals, GetHashCode, ToString, and
Finalize
Class Objects in C#
Class objects are either “public” or
“internal”
Every C# class gets a “free” default
constructor
ensures that all member data is set to an
appropriate default value
value-type data are initialized with a default,
safe value (e.g., int and doubles are
initialized to 0)
reference-type data are initialized to null
Class Objects in C#
As soon as you define a custom constructor,
the default constructor is removed
class loader however still initializes attributes to
default values
if a default constructor is still needed, you will have
to provide it.
There are no “friend” classes. Visibility
modifier “internal” is similar but not the same
Class attributes can be initialized by
assignment when declared
Class Objects in C#
A class can be declared as “static”
In fact the class that contains Main() must
be declared static
Typically one .cs file contains the
declaration of one C# class
C# classes can span multiple files using
the “partial” modifier
Inheritance in C#
Much the same as in C++
Multiple inheritance is not supported
You can however implement as many
interfaces as you like
Abstract methods and classes must be
marked as such using the keyword
“abstract”
Loops and Branching in C#
“for”, “while”, “do … while”, “if … else” all
work as in C/C++
“foreach” is new to C#
Allows interation over items in a collection
or array
No need to test for upper and lower limits
Example:
string[] colorSchemes = { “Day”, “Dusk”, “Night” };
foreach (string s in colorSchemes { … }
Loops and Branching in C#
“switch” works as in C/C++ with a couple
of exceptions…
each “case” must have a terminating “break”
unless there is no code between “case”s
the “switch” statement can evaluate strings
Accessors and Mutators
Object oriented encapsulation
Attributes should not be directly accessible
Accessors should be provided to retrieve
state
Mutators should be provided to set state
Traditional approach:
GetXXX() or get_XXX()
SetXXX() or set_XXX()
C# uses properties
C# Properties
Example:
private double lat;
public double Lat {get{return lat;} set{lat=value;}}
“value” is not a keyword but rather a
contentual keyword
Properties feel more “natural”
Instead of:
double myLat = gsoPoint.get_Lat();
We use:
double myLat = gsoPoint.Lat;
C# Properties
Accessors and mutators can have
different visibility:
private double lat;
public double Lat {get{return lat;} protected set{lat=value;}}
How would you make a property read or
write only?
Properties can be “static”
C# Casting Rules
Any data type can be stored in an
“object” variable:
object shape = new GSOLine();
Any subclass object can be stored in a
superclass object variable:
GSOShape shape = new GSOLine();
C# Casting Rules
How do we get it back?
GSOLine line = (GSOLine)shape;
What if “shape” is not a “GSOLine”?
InvalidCastException is thrown at runtime
C# Casting Rules
Is there another way?
GSOLine line = shape as GSOLine;
What if “shape” is not a “GSOLine”?
The “as” operation will return null
C# Casting Rules
Which is better?
Exceptions are expensive
Can we tell before we cast?
if (shape is GSOLine)
Download