1. Introduction
1.1 What is .NET?
.NET is a general-purpose software development platform, similar to Java. At
its core is a virtual machine that turns intermediate language (IL) into
machine code. High-level language compilers for C#, VB.NET and C++ are provided
to turn source code into IL. C# is a new programming language, very similar to
Java. An extensive class library is included, featuring all the functionality one
might expect from a contempory development platform -
windows GUI development (Windows Forms), database access (ADO.NET), web
development (ASP.NET), web services, XML etc.
See also Microsoft's definition.
1.2 When was .NET announced?
Bill Gates delivered a keynote at Forum 2000, held June 22, 2000, outlining the
.NET 'vision'. The July 2000 PDC had a number of sessions on .NET technology,
and delegates were given CDs containing a pre-release version of the .NET
framework/SDK and Visual Studio.NET.
1.3 What versions of .NET are there?
The final versions of the 1.0 SDK and runtime were made publicly available
around 6pm PST on 15-Jan-2002. At the same time, the final version of Visual
Studio.NET was made available to MSDN subscribers.
.NET 1.1 was released in April 2003, and was mostly bug fixes for 1.0.
.NET 2.0 was released to MSDN subscribers in late October 2005, and was
officially launched in early November.
1.4 What operating systems does the .NET
Framework run on?
The runtime supports Windows Server 2003, Windows XP, Windows 2000, NT4 SP6a
and Windows ME/98. Windows 95 is not supported. Some parts of the framework do
not work on all platforms - for example, ASP.NET is only supported on XP and
Windows 2000/2003. Windows 98/ME cannot be used for
development.
IIS is not supported on Windows XP Home Edition, and so cannot be used to host
ASP.NET. However, the ASP.NET Web Matrix web server does run on XP Home.
The .NET Compact Framework is a version of the .NET Framework for mobile
devices, running Windows CE or Windows Mobile.
The Mono project has a version of the .NET Framework that runs on Linux.
1.5 What tools can I use to develop .NET
applications?
There are a number of tools, described here in ascending order of cost:
The .NET Framework SDK is free and includes command-line compilers for C++, C#,
and VB.NET and various other utilities to aid development.
SharpDevelop is a free IDE for C# and VB.NET.
Microsoft Visual Studio Express editions are cut-down versions of Visual
Studio, for hobbyist or novice developers.There are
different versions for C#, VB, web development etc. Originally the plan was to
charge $49, but MS has decided to offer them as free downloads instead, at
least until November 2006.
Microsoft Visual Studio Standard 2005 is around $300, or $200 for the upgrade.
Microsoft VIsual Studio Professional 2005 is around
$800, or $550 for the upgrade.
At the top end of the price range are the Microsoft
Visual Studio Team Edition for Software Developers 2005 with MSDN Premium and
Team Suite editions.
You can see the differences between the various Visual Studio versions here.
1.6 Why did they call it .NET?
I don't know what they were thinking. They certainly weren't thinking of people
using search tools. It's meaningless marketing nonsense.
2. Terminology
2.1 What is the CLI? Is it the same as the CLR?
The CLI (Common Language Infrastructure) is the definiton
of the fundamentals of the .NET framework - the Common Type System (CTS),
metadata, the Virtual Execution Environment (VES) and its use of intermediate
language (IL), and the support of multiple programming languages via the Common
Language Specification (CLS). The CLI is documented through ECMA - see http://msdn.microsoft.com/net/ecma/
for more details.
The CLR (Common Language Runtime) is Microsoft's primary implementation of the
CLI. Microsoft also have a shared source
implementation known as ROTOR, for educational purposes, as well as the .NET
Compact Framework for mobile devices. Non-Microsoft CLI implementations include
Mono and DotGNU Portable.NET.
2.2 What is the
CTS, and how does it relate to the CLS?
CTS = Common Type System. This is the full range of types that the .NET runtime
understands. Not all .NET languages support all the types in the CTS.
CLS = Common Language Specification. This is a subset of the CTS which all .NET
languages are expected to support. The idea is that any program which uses
CLS-compliant types can interoperate with any .NET program written in any
language. This interop is very fine-grained - for
example a VB.NET class can inherit from a C# class.
2.3 What is IL?
IL = Intermediate Language. Also known as MSIL (Microsoft
Intermediate Language) or CIL (Common Intermediate Language). All .NET
source code (of any language) is compiled to IL during development. The IL is
then converted to machine code at the point where the software is installed, or
(more commonly) at run-time by a Just-In-Time (JIT) compiler.
2.4 What is C#?
C# is a new language designed by Microsoft to work with the .NET framework. In
their "Introduction to C#" whitepaper, Microsoft describe
C# as follows:
"C# is a simple, modern, object oriented, and type-safe programming
language derived from C and C++. C# (pronounced “C sharp”) is firmly planted in
the C and C++ family tree of languages, and will immediately be familiar to C
and C++ programmers. C# aims to combine the high productivity of Visual Basic
and the raw power of C++."
Substitute 'Java' for 'C#' in the quote above, and you'll see that the
statement still works pretty well :-).
If you are a C++ programmer, you might like to check out my C# FAQ.
2.5 What does 'managed' mean in the .NET
context?
The term 'managed' is the cause of much confusion. It is used in various places
within .NET, meaning slightly different things.
Managed code: The .NET framework provides several core run-time services to the
programs that run within it - for example exception handling and security. For
these services to work, the code must provide a minimum level of information to
the runtime. Such code is called managed code.
Managed data: This is data that is allocated and freed by the .NET runtime's
garbage collector.
Managed classes: This is usually referred to in the context of Managed
Extensions (ME) for C++. When using ME C++, a class can be marked with the __gc keyword. As the name suggests, this means that the
memory for instances of the class is managed by the garbage collector, but it
also means more than that. The class becomes a fully paid-up member of the .NET
community with the benefits and restrictions that brings. An example of a
benefit is proper interop with classes written in
other languages - for example, a managed C++ class can inherit from a VB class.
An example of a restriction is that a managed class can only inherit from one
base class.
2.6 What is reflection?
All .NET compilers produce metadata about the types defined in the modules they
produce. This metadata is packaged along with the module (modules in turn are
packaged together in assemblies), and can be accessed by a mechanism called
reflection. The System.Reflection namespace contains
classes that can be used to interrogate the types for a module/assembly.
Using reflection to access .NET metadata is very similar to using ITypeLib/ITypeInfo to access type library data in COM, and
it is used for similar purposes - e.g. determining data type sizes for
marshaling data across context/process/machine boundaries.
Reflection can also be used to dynamically invoke methods (see System.Type.InvokeMember), or even create types dynamically
at run-time (see System.Reflection.Emit.TypeBuilder).
3.1 What is an assembly?
An assembly is sometimes described as a logical .EXE or .DLL, and can be an
application (with a main entry point) or a library. An assembly consists of one
or more files (dlls, exes, html files etc), and
represents a group of resources, type definitions, and implementations of those
types. An assembly may also contain references to other assemblies. These
resources, types and references are described in a block of data called a
manifest. The manifest is part of the assembly, thus making the assembly
self-describing.
An important aspect of assemblies is that they are part of the identity of a
type. The identity of a type is the assembly that houses it combined with the
type name. This means, for example, that if assembly A
exports a type called T, and assembly B exports a type called T, the .NET
runtime sees these as two completely different types. Furthermore, don't get
confused between assemblies and namespaces - namespaces are merely a
hierarchical way of organising type names. To the
runtime, type names are type names, regardless of whether namespaces are used
to organise the names. It's the assembly plus the typename (regardless of whether the type name belongs to a
namespace) that uniquely indentifies a type to the
runtime.
Assemblies are also important in .NET with respect to security - many of the
security restrictions are enforced at the assembly boundary.
Finally, assemblies are the unit of versioning in .NET - more on this below.
3.2 How can I produce an assembly?
The simplest way to produce an assembly is directly from a .NET compiler. For
example, the following C# program:
public class CTest
{
public CTest() { System.Console.WriteLine(
"Hello from CTest" ); }
}
can be compiled into a library assembly (dll) like this:
csc /t:library
ctest.cs
You can then view the contents of the assembly by running the "IL Disassembler" tool that comes with the .NET SDK.
Alternatively you can compile your source into modules, and then combine the
modules into an assembly using the assembly linker (al.exe). For the C# compiler,
the /target:module switch is
used to generate a module instead of an assembly.
3.3 What is the difference between a
private assembly and a shared assembly?
Location and visibility: A private assembly is normally used by a single
application, and is stored in the application's directory, or a sub-directory
beneath. A shared assembly is normally stored in the global assembly cache,
which is a repository of assemblies maintained by the .NET runtime. Shared
assemblies are usually libraries of code which many applications will find
useful, e.g. the .NET framework classes.
Versioning: The runtime enforces versioning constraints only on shared
assemblies, not on private assemblies.
3.4 How do assemblies find each other?
By searching directory paths. There are several
factors which can affect the path (such as the AppDomain
host, and application configuration files), but for private assemblies the
search path is normally the application's directory and its sub-directories.
For shared assemblies, the search path is normally same as the private assembly
path plus the shared assembly cache.
3.5 How does assembly versioning work?
Each assembly has a version number called the compatibility version. Also each
reference to an assembly (from another assembly) includes both the name and
version of the referenced assembly.
The version number has four numeric parts (e.g. 5.5.2.33). Assemblies with
either of the first two parts different are normally viewed as incompatible. If
the first two parts are the same, but the third is different, the assemblies
are deemed as 'maybe compatible'. If only the fourth part is different, the
assemblies are deemed compatible. However, this is just the default guideline -
it is the version policy that decides to what extent these rules are enforced.
The version policy can be specified via the application configuration file.
Remember: versioning is only applied to shared assemblies, not private
assemblies.
3.6 How can I develop an application that
automatically updates itself from the web?
For .NET 1.x, use the Updater Application
Block. For .NET 2.x, use ClickOnce.
4. Application Domains
4.1 What is an application domain?
An AppDomain can be thought of as a lightweight
process. Multiple AppDomains can exist inside a Win32
process. The primary purpose of the AppDomain is to
isolate applications from each other, and so it is particularly useful in
hosting scenarios such as ASP.NET. An AppDomain can
be destroyed by the host without affecting other AppDomains
in the process.
Win32 processes provide isolation by having distinct memory address spaces.
This is effective, but expensive. The .NET runtime enforces AppDomain
isolation by keeping control over the use of memory - all memory in the AppDomain is managed by the .NET runtime, so the runtime
can ensure that AppDomains do not access each other's
memory.
One non-obvious use of AppDomains is for unloading
types. Currently the only way to unload a .NET type is to destroy the AppDomain it is loaded into. This is particularly useful if
you create and destroy types on-the-fly via
reflection.
Microsoft have an AppDomain
FAQ.
4.2 How does an AppDomain
get created?
AppDomains are usually created by hosts. Examples of
hosts are the Windows Shell, ASP.NET and IE. When you run a .NET application
from the command-line, the host is the Shell. The Shell creates a new AppDomain for every application.
AppDomains can also be explicitly created by .NET
applications. Here is a C# sample which creates an AppDomain,
creates an instance of an object inside it, and then executes one of the
object's methods:
using System;
using System.Runtime.Remoting;
using System.Reflection;
public class CAppDomainInfo : MarshalByRefObject
{
public string GetName() {
return AppDomain.CurrentDomain.FriendlyName; }
}
public class App
{
public static int Main()
{
AppDomain
ad = AppDomain.CreateDomain( "Andy's new
domain" );
CAppDomainInfo
adInfo = (CAppDomainInfo)ad.CreateInstanceAndUnwrap(
Assembly.GetCallingAssembly().GetName().Name, "CAppDomainInfo"
);
Console.WriteLine(
"Created AppDomain name = " + adInfo.GetName() );
return 0;
}
}
4.3 Can I write my own .NET host?
Yes. For an example of how to do this, take a look at the source for the dm.net
moniker developed by Jason Whittington and Don Box. There is also a code sample
in the .NET SDK called CorHost.
5. Garbage Collection
5.1 What is garbage collection?
Garbage collection is a heap-management strategy where a run-time component
takes responsibility for managing the lifetime of the memory used by objects.
This concept is not new to .NET - Java and many other languages/runtimes have
used garbage collection for some time.
5.2 Is it true that objects don't always
get destroyed immediately when the last reference goes away?
Yes. The garbage collector offers no guarantees about the time when an object
will be destroyed and its memory reclaimed.
There was an interesting thread on the DOTNET list, started by Chris Sells,
about the implications of non-deterministic destruction of objects in C#. In
October 2000, Microsoft's Brian Harry posted a lengthy analysis of the problem.
Chris Sells' response to Brian's posting is here.
5.3 Why doesn't the .NET runtime offer
deterministic destruction?
Because of the garbage collection algorithm. The .NET
garbage collector works by periodically running through a list of all the
objects that are currently being referenced by an application. All the objects
that it doesn't find during this search are ready to be destroyed and the
memory reclaimed. The implication of this algorithm is that the runtime doesn't
get notified immediately when the final reference on an object goes away - it
only finds out during the next 'sweep' of the heap.
Futhermore, this type of algorithm works best by
performing the garbage collection sweep as rarely as possible. Normally heap
exhaustion is the trigger for a collection sweep.
5.4 Is the lack of deterministic
destruction in .NET a problem?
It's certainly an issue that affects component design. If you have objects that
maintain expensive or scarce resources (e.g. database locks), you need to
provide some way to tell the object to release the resource when it is done.
Microsoft recommend that you provide a method called Dispose()
for this purpose. However, this causes problems for distributed objects - in a
distributed system who calls the Dispose() method?
Some form of reference-counting or ownership-management mechanism is needed to
handle distributed objects - unfortunately the runtime offers no help with
this.
5.5 Should I implement Finalize on my
class? Should I implement IDisposable?
This issue is a little more complex than it first appears. There are really two
categories of class that require deterministic destruction - the first category manipulate unmanaged types directly, whereas the
second category manipulate managed types that require deterministic
destruction. An example of the first category is a class with an IntPtr member representing an OS file handle. An example of
the second category is a class with a System.IO.FileStream
member.
For the first category, it makes sense to implement IDisposable
and override Finalize. This allows the object user to 'do the right thing' by
calling Dispose, but also provides a fallback of freeing the unmanaged resource
in the Finalizer, should the calling code fail in its
duty. However this logic does not apply to the second category of class, with
only managed resources. In this case implementing Finalize is pointless, as
managed member objects cannot be accessed in the Finalizer.
This is because there is no guarantee about the ordering of Finalizer
execution. So only the Dispose method should be implemented. (If you think
about it, it doesn't really make sense to call Dispose on member objects from a
Finalizer anyway, as the member object's Finalizer will do the required cleanup.)
For classes that need to implement IDisposable and
override Finalize, see Microsoft's documented pattern.
Note that some developers argue that implementing a Finalizer
is always a bad idea, as it hides a bug in your code (i.e. the lack of a
Dispose call). A less radical approach is to implement Finalize but include a Debug.Assert at the start, thus signalling
the problem in developer builds but allowing the cleanup to occur in release
builds.
5.6 Do I have any control over the garbage
collection algorithm?
A little. For example the System.GC
class exposes a Collect method, which forces the garbage collector to collect
all unreferenced objects immediately.
Also there is a gcConcurrent setting that can be
specified via the application configuration file. This specifies whether or not
the garbage collector performs some of its collection activities on a separate
thread. The setting only applies on multi-processor machines, and defaults to
true.
5.7 How can I find out what the garbage
collector is doing?
Lots of interesting statistics are exported from the .NET runtime via the '.NET
CLR xxx' performance counters. Use Performance Monitor to view them.
5.8 What is the lapsed listener problem?
The lapsed listener problem is one of the primary causes of leaks in .NET
applications. It occurs when a subscriber (or 'listener') signs up for a
publisher's event, but fails to unsubscribe. The failure to unsubscribe means
that the publisher maintains a reference to the subscriber as long as the
publisher is alive. For some publishers, this may be the duration of the
application.
This situation causes two problems. The obvious problem is the leakage of the
subscriber object. The other problem is the performance degredation
due to the publisher sending redundant notifications to 'zombie' subscribers.
There are at least a couple of solutions to the problem. The simplest is to
make sure the subscriber is unsubscribed from the publisher, typically by
adding an Unsubscribe() method to the subscriber.
Another solution, documented here by Shawn Van Ness, is to change the publisher
to use weak references in its subscriber list.
5.9 When do I need to use GC.KeepAlive?
It's very unintuitive, but the runtime can decide that an object is garbage
much sooner than you expect. More specifically, an object can become garbage
while a method is executing on the object, which is contrary to most
developers' expectations. Chris Brumme explains the
issue on his blog. I've taken Chris's code and
expanded it into a full app that you can play with if you want to prove to
yourself that this is a real problem:
using System;
using System.Runtime.InteropServices;
class Win32
{
[DllImport("kernel32.dll")]
public static extern IntPtr
CreateEvent( IntPtr lpEventAttributes,
bool bManualReset,bool
bInitialState, string lpName);
[DllImport("kernel32.dll",
SetLastError=true)]
public static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
public static extern bool SetEvent(IntPtr hEvent);
}
class EventUser
{
public EventUser()
{
hEvent =
Win32.CreateEvent( IntPtr.Zero, false, false, null );
}
~EventUser()
{
Win32.CloseHandle( hEvent );
Console.WriteLine("EventUser finalized");
}
public void UseEvent()
{
UseEventInStatic(
this.hEvent );
}
static void UseEventInStatic(
IntPtr hEvent )
{
//GC.Collect();
bool bSuccess
= Win32.SetEvent( hEvent );
Console.WriteLine(
"SetEvent " + (bSuccess
? "succeeded" : "FAILED!") );
}
IntPtr hEvent;
}
class App
{
static void Main(string[] args)
{
EventUser eventUser = new EventUser();
eventUser.UseEvent();
}
}
If you run this code, it'll probably work fine, and you'll get the following output:
SetEvent succeeded
EventDemo finalized
However, if you uncomment the GC.Collect() call in
the UseEventInStatic() method, you'll get this
output:
EventDemo finalized
SetEvent FAILED!
(Note that you need to use a release build to reproduce this problem.)
So what's happening here? Well, at the point where UseEvent() calls UseEventInStatic(), a copy is taken of the hEvent field, and there are no further references to the EventUser object anywhere in the code. So as far as the
runtime is concerned, the EventUser object is garbage
and can be collected. Normally of course the collection won't happen
immediately, so you'll get away with it, but sooner or later a collection will
occur at the wrong time, and your app will fail.
A solution to this problem is to add a call to GC.KeepAlive(this) to the
end of the UseEvent method, as Chris explains.
6. Serialization
6.1 What is serialization?
Serialization is the process of converting an object into a stream of bytes. Deserialization is the opposite process, i.e. creating an
object from a stream of bytes. Serialization/Deserialization
is mostly used to transport objects (e.g. during remoting),
or to persist objects (e.g. to a file or database).
6.2 Does the .NET Framework have in-built
support for serialization?
There are two separate mechanisms provided by the .NET class library - XmlSerializer and SoapFormatter/BinaryFormatter.
Microsoft uses XmlSerializer for Web Services, and SoapFormatter/BinaryFormatter
for remoting. Both are available for use in your own
code.
6.3 I want to serialize instances of my
class. Should I use XmlSerializer, SoapFormatter or BinaryFormatter?
It depends. XmlSerializer has severe limitations such
as the requirement that the target class has a parameterless
constructor, and only public read/write properties and fields can be
serialized. However, on the plus side, XmlSerializer
has good support for customising the XML document
that is produced or consumed. XmlSerializer's
features mean that it is most suitable for cross-platform work, or for
constructing objects from existing XML documents.
SoapFormatter and BinaryFormatter
have fewer limitations than XmlSerializer. They can
serialize private fields, for example. However they both require that the
target class be marked with the [Serializable]
attribute, so like XmlSerializer the class needs to
be written with serialization in mind. Also there are some quirks to watch out
for - for example on deserialization the constructor
of the new object is not invoked.
The choice between SoapFormatter and BinaryFormatter depends on the application. BinaryFormatter makes sense where both serialization and deserialization will be performed on the .NET platform and
where performance is important. SoapFormatter
generally makes more sense in all other cases, for ease of debugging if nothing
else.
6.4 Can I customise
the serialization process?
Yes. XmlSerializer supports a range of attributes
that can be used to configure serialization for a particular class. For
example, a field or property can be marked with the [XmlIgnore]
attribute to exclude it from serialization. Another example is the [XmlElement] attribute, which can be used to specify the XML
element name to be used for a particular property or field.
Serialization via SoapFormatter/BinaryFormatter can
also be controlled to some extent by attributes. For example, the [NonSerialized] attribute is the equivalent of XmlSerializer's [XmlIgnore]
attribute. Ultimate control of the serialization process can be acheived by implementing the the ISerializable interface on the class whose instances are to
be serialized.
6.5 Why is XmlSerializer
so slow?
There is a once-per-process-per-type overhead with XmlSerializer.
So the first time you serialize or deserialize an
object of a given type in an application, there is a significant delay. This
normally doesn't matter, but it may mean, for example, that XmlSerializer
is a poor choice for loading configuration settings during startup of a GUI application.
6.6 Why do I get errors when I try to
serialize a Hashtable?
XmlSerializer will refuse to serialize instances of
any class that implements IDictionary, e.g. Hashtable. SoapFormatter and BinaryFormatter do not have this restriction.
6.7 XmlSerializer
is throwing a generic "There was an error reflecting MyClass"
error. How do I find out what the problem is?
Look at the InnerException property of the exception
that is thrown to get a more specific error message.
6.8 Why am I getting an InvalidOperationException when I serialize an ArrayList?
XmlSerializer needs to know in advance what type of
objects it will find in an ArrayList. To specify the
type, use the XmlArrayItem attibute
like this:
public class Person
{
public string Name;
public int Age;
}
public class Population
{
[XmlArrayItem(typeof(Person))] public ArrayList People;
}
7. Attributes
7.1 What are attributes?
There are at least two types of .NET attribute. The first type I will refer to
as a metadata attribute - it allows some data to be attached to a class or
method. This data becomes part of the metadata for the class, and (like other
class metadata) can be accessed via reflection. An example of a metadata
attribute is [serializable], which can be attached to
a class and means that instances of the class can be serialized.
[serializable]
public class CTest {}
The other type of attribute is a context attribute. Context attributes use a
similar syntax to metadata attributes but they are fundamentally different.
Context attributes provide an interception mechanism whereby instance
activation and method calls can be pre- and/or post-processed. If you have
encountered Keith Brown's universal delegator you'll
be familiar with this idea.
7.2 Can I create my own metadata
attributes?
Yes. Simply derive a class from System.Attribute and
mark it with the AttributeUsage attribute. For
example:
[AttributeUsage(AttributeTargets.Class)]
public class InspiredByAttribute : System.Attribute
{
public string InspiredBy;
public InspiredByAttribute(
string inspiredBy )
{
InspiredBy
= inspiredBy;
}
}
[InspiredBy("Andy Mc's brilliant
.NET FAQ")]
class CTest
{
}
class CApp
{
public static void Main()
{
object[] atts
= typeof(CTest).GetCustomAttributes(true);
foreach(
object att in atts )
if( att
is InspiredByAttribute )
Console.WriteLine( "Class CTest
was inspired by {0}", ((InspiredByAttribute)att).InspiredBy );
}
}
7.3 Can I create my own context attibutes?
Yes. Take a look at Peter Drayton's Tracehook.NET.
8. Code Access Security
8.1 What is Code Access Security (CAS)?
CAS is the part of the .NET security model that determines whether or not code
is allowed to run, and what resources it can use when it is running. For
example, it is CAS that will prevent a .NET web applet from formatting your
hard disk.
8.2 How does CAS work?
The CAS security policy revolves around two key concepts - code groups and
permissions. Each .NET assembly is a member of a particular code group, and
each code group is granted the permissions specified in a named permission set.
For example, using the default security policy, a control downloaded from a web
site belongs to the 'Zone - Internet' code group, which adheres to the
permissions defined by the 'Internet' named permission set. (Naturally the
'Internet' named permission set represents a very restrictive range of
permissions.)
8.3 Who defines the CAS code groups?
Microsoft defines some default ones, but you can modify these and even create
your own. To see the code groups defined on your system, run 'caspol -lg' from the
command-line. On my system it looks like this:
Level = Machine
Code Groups:
1. All code: Nothing
1.1. Zone - MyComputer: FullTrust
1.1.1. Honor SkipVerification
requests: SkipVerification
1.2. Zone - Intranet: LocalIntranet
1.3. Zone - Internet: Internet
1.4. Zone - Untrusted: Nothing
1.5. Zone - Trusted: Internet
1.6. StrongName -
0024000004800000940000000602000000240000525341310004000003
000000CFCB3291AA715FE99D40D49040336F9056D7886FED46775BC7BB5430BA4444FEF8348EBD06
F962F39776AE4DC3B7B04A7FE6F49F25F740423EBF2C0B89698D8D08AC48D69CED0FC8F83B465E08
07AC11EC1DCC7D054E807A43336DDE408A5393A48556123272CEEEE72F1660B71927D38561AABF5C
AC1DF1734633C602F8F2D5: Everything
Note the hierarchy of code groups - the top of the hierarchy is the most
general ('All code'), which is then sub-divided into several groups, each of
which in turn can be sub-divided. Also note that (somewhat counter-intuitively)
a sub-group can be associated with a more permissive permission set than its
parent.
8.4 How do I define my own code group?
Use caspol. For example, suppose you trust code from www.mydomain.com and you want it
have full access to your system, but you want to keep the default restrictions
for all other internet sites. To achieve this, you would add a new code group
as a sub-group of the 'Zone - Internet' group, like this:
caspol -ag
1.3 -site www.mydomain.com
FullTrust
Now if you run caspol -lg
you will see that the new group has been added as group 1.3.1:
...
1.3. Zone - Internet: Internet
1.3.1. Site - www.mydomain.com:
FullTrust
...
Note that the numeric label (1.3.1) is just a caspol
invention to make the code groups easy to manipulate from the command-line. The
underlying runtime never sees it.
8.5 How do I change the permission set for
a code group?
Use caspol. If you are the machine administrator, you
can operate at the 'machine' level - which means not only that the changes you
make become the default for the machine, but also that users cannot change the
permissions to be more permissive. If you are a normal (non-admin) user you can
still modify the permissions, but only to make them more restrictive. For
example, to allow intranet code to do what it likes you might do this:
caspol -cg 1.2 FullTrust
Note that because this is more permissive than the default policy (on a standard
system), you should only do this at the machine level - doing it at the user
level will have no effect.
8.6 Can I create my own permission set?
Yes. Use caspol -ap, specifying an XML file containing the permissions
in the permission set. To save you some time, here is a sample file
corresponding to the 'Everything' permission set - just edit to suit your
needs. When you have edited the sample, add it to the range of available
permission sets like this:
caspol -ap samplepermset.xml
Then, to apply the permission set to a code group, do something like this:
caspol -cg 1.3 SamplePermSet
(By default, 1.3 is the 'Internet' code group)
8.7 I'm having some trouble with CAS. How
can I troubleshoot the problem?
Caspol has a couple of options that might help.
First, you can ask caspol to tell you what code group
an assembly belongs to, using caspol -rsg. Similarly, you can ask what permissions are being
applied to a particular assembly using caspol -rsp.
8.8 I can't be bothered with CAS. Can I
turn it off?
Yes, as long as you are an administrator. Just run:
caspol -s off
9. Intermediate Language (IL)
9.1 Can I look at the IL for an assembly?
Yes. MS supply a tool called Ildasm that can be used
to view the metadata and IL for an assembly.
9.2 Can source code be reverse-engineered
from IL?
Yes, it is often relatively straightforward to regenerate high-level source
from IL. Lutz Roeder's Reflector does a very good job of turning IL into C# or
VB.NET.
9.3 How can I stop my code being
reverse-engineered from IL?
You can buy an IL obfuscation tool. These tools work by 'optimising'
the IL in such a way that reverse-engineering becomes much more difficult.
Of course if you are writing web services then reverse-engineering is not a
problem as clients do not have access to your IL.
9.4 Can I write IL programs directly?
Yes. Peter Drayton posted this simple example to the DOTNET mailing list:
.assembly MyAssembly {}
.class MyApp {
.method static void
.entrypoint
ldstr
"Hello, IL!"
call void System.Console::WriteLine(class System.Object)
ret
}
}
Just put this into a file called hello.il, and then
run ilasm hello.il. An exe
assembly will be generated.
9.5 Can I do things in IL that I can't do
in C#?
Yes. A couple of simple examples are that you can throw exceptions that are not
derived from System.Exception, and you can have
non-zero-based arrays.
10. Implications for COM
10.1 Does .NET replace COM?
This subject causes a lot of controversy, as you'll see if you read the mailing
list archives. Take a look at the following two threads:
http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&D=0&P=68241
http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&P=R60761
The bottom line is that .NET has its own mechanisms for type interaction, and
they don't use COM. No IUnknown, no IDL, no typelibs, no registry-based activation. This is mostly
good, as a lot of COM was ugly. Generally speaking, .NET allows you to package
and use components in a similar way to COM, but makes the whole thing a bit
easier.
10.2 Is DCOM dead?
Pretty much, for .NET developers. The .NET Framework
has a new remoting model which is not based on DCOM.
DCOM was pretty much dead anyway, once firewalls became widespread and
Microsoft got SOAP fever. Of course DCOM will still be used in interop scenarios.
10.3 Is COM+ dead?
Not immediately. The approach for .NET 1.0 was to provide access to the
existing COM+ services (through an interop layer)
rather than replace the services with native .NET ones. Various tools and
attributes were provided to make this as painless as possible. Over time it is
expected that interop will become more seamless -
this may mean that some services become a core part of the CLR, and/or it may
mean that some services will be rewritten as managed code which runs on top of
the CLR.
For more on this topic, search for postings by Joe Long in the archives - Joe
is the MS group manager for COM+. Start with this message:
http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&P=R68370
10.4 Can I use COM components from .NET
programs?
Yes. COM components are accessed from the .NET runtime via a Runtime Callable
Wrapper (RCW). This wrapper turns the COM interfaces exposed by the COM
component into .NET-compatible interfaces. For oleautomation
interfaces, the RCW can be generated automatically from a type library. For
non-oleautomation interfaces, it may be necessary to
develop a custom RCW which manually maps the types exposed by the COM interface
to .NET-compatible types.
Here's a simple example for those familiar with ATL. First, create an ATL
component which implements the following IDL:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(EA013F93-487A-4403-86EC-FD9FEE5E6206),
helpstring("ICppName Interface"),
pointer_default(unique),
oleautomation
]
interface ICppName : IUnknown
{
[helpstring("method SetName")] HRESULT SetName([in]
BSTR name);
[helpstring("method GetName")] HRESULT GetName([out,retval] BSTR *pName );
};
[
uuid(F5E4C61D-D93A-4295-A4B4-2453D4A4484D),
version(1.0),
helpstring("cppcomserver 1.0 Type Library")
]
library CPPCOMSERVERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(600CE6D9-5ED7-4B4D-BB49-E8D5D5096F70),
helpstring("CppName Class")
]
coclass CppName
{
[default] interface ICppName;
};
};
When you've built the component, you should get a typelibrary.
Run the TLBIMP utility on the typelibary, like this:
tlbimp cppcomserver.tlb
If successful, you will get a message like this:
Typelib imported successfully to
CPPCOMSERVERLib.dll
You now need a .NET client - let's use C#. Create a .cs file containing the following code:
using System;
using CPPCOMSERVERLib;
public class MainApp
{
static public void Main()
{
CppName cppname = new CppName();
cppname.SetName(
"bob" );
Console.WriteLine(
"Name is " + cppname.GetName() );
}
}
Compile the C# code like this:
csc /r:cppcomserverlib.dll csharpcomclient.cs
Note that the compiler is being told to reference the DLL we previously
generated from the typelibrary using TLBIMP. You
should now be able to run csharpcomclient.exe, and get the following output on
the console:
Name is bob
10.5 Can I use .NET components from COM programs?
Yes. .NET components are accessed from COM via a COM Callable Wrapper (CCW).
This is similar to a RCW (see previous question), but works in the opposite
direction. Again, if the wrapper cannot be automatically generated by the .NET
development tools, or if the automatic behaviour is
not desirable, a custom CCW can be developed. Also, for COM to 'see' the .NET
component, the .NET component must be registered in the registry.
Here's a simple example. Create a C# file called testcomserver.cs
and put the following in it:
using System;
using System.Runtime.InteropServices;
namespace AndyMc
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CSharpCOMServer
{
public CSharpCOMServer()
{}
public void SetName(
string name ) { m_name = name; }
public string GetName()
{ return m_name; }
private string m_name;
}
}
Then compile the .cs file as follows:
csc /target:library
testcomserver.cs
You should get a dll, which you register like this:
regasm testcomserver.dll /tlb:testcomserver.tlb /codebase
Now you need to create a client to test your .NET COM component. VBScript will
do - put the following in a file called comclient.vbs:
Dim dotNetObj
Set dotNetObj = CreateObject("AndyMc.CSharpCOMServer")
dotNetObj.SetName ("bob")
MsgBox "Name is " & dotNetObj.GetName()
and run the script like this:
wscript comclient.vbs
And hey presto you should get a message box displayed with the text "Name
is bob".
An alternative to the approach above it to use the dm.net
moniker developed by Jason Whittington and Don Box.
10.6 Is ATL redundant in the .NET world?
Yes. ATL will continue to be valuable for writing COM components for some time,
but it has no place in the .NET world.
11. Threads
11.1 How do I spawn a thread?
Create an instance of a System.Threading.Thread
object, passing it an instance of a ThreadStart
delegate that will be executed on the new thread. For example:
class MyThread
{
public MyThread( string initData )
{
m_data = initData;
m_thread =
new Thread( new ThreadStart(ThreadMain)
);
m_thread.Start();
}
// ThreadMain() is
executed on the new thread.
private void ThreadMain()
{
Console.WriteLine(
m_data );
}
public void WaitUntilFinished()
{
m_thread.Join();
}
private Thread m_thread;
private string m_data;
}
In this case creating an instance of the MyThread
class is sufficient to spawn the thread and execute the MyThread.ThreadMain()
method:
MyThread t = new MyThread(
"Hello, world." );
t.WaitUntilFinished();
11.2 How do I stop a thread?
There are several options. First, you can use your own communication mechanism
to tell the ThreadStart method to finish.
Alternatively the Thread class has in-built support for instructing the thread
to stop. The two principle methods are Thread.Interrupt() and Thread.Abort(). The former
will cause a ThreadInterruptedException to be thrown
on the thread when it next goes into a WaitJoinSleep
state. In other words, Thread.Interrupt is a polite
way of asking the thread to stop when it is no longer doing any useful work. In
contrast, Thread.Abort() throws a ThreadAbortException
regardless of what the thread is doing. Furthermore, the ThreadAbortException
cannot normally be caught (though the ThreadStart's
finally method will be executed). Thread.Abort() is a heavy-handed mechanism which should not normally be
required.
11.3 How do I use the thread pool?
By passing an instance of a WaitCallback delegate to
the ThreadPool.QueueUserWorkItem() method
class CApp
{
static void Main()
{
string s = "Hello, World";
ThreadPool.QueueUserWorkItem(
new WaitCallback( DoWork ),
s );
Thread.Sleep(
1000 ); // Give time for work item to be executed
}
// DoWork is executed on
a thread from the thread pool.
static void DoWork(
object state )
{
Console.WriteLine(
state );
}
}
11.4 How do I know when my thread pool work item has completed?
There is no way to query the thread pool for this information. You must put
code into the WaitCallback method to signal that it
has completed. Events are useful for this.
11.5 How do I prevent concurrent access to
my data?
Each object has a concurrency lock (critical section) associated with it. The System.Threading.Monitor.Enter/Exit methods are used to
acquire and release this lock. For example, instances of the following class
only allow one thread at a time to enter method f():
class C
{
public void f()
{
try
{
Monitor.Enter(this);
...
}
finally
{
Monitor.Exit(this);
}
}
}
C# has a 'lock' keyword which provides a convenient shorthand for the code
above:
class C
{
public void f()
{
lock(this)
{
...
}
}
}
Note that calling Monitor.Enter(myObject)
does NOT mean that all access to myObject is
serialized. It means that the synchronisation lock
associated with myObject has been acquired, and no
other thread can acquire that lock until Monitor.Exit(o) is called. In other words, this class is functionally
equivalent to the classes above:
class C
{
public void f()
{
lock( m_object
)
{
...
}
}
private m_object = new
object();
}
Actually, it could be argued that this version of the code is superior, as the
lock is totally encapsulated within the class, and not accessible to the user
of the object.
11.6 Should I use ReaderWriterLock
instead of Monitor.Enter/Exit?
Maybe, but be careful. ReaderWriterLock is used to
allow multiple threads to read from a data source, while still granting
exclusive access to a single writer thread. This makes sense for data access
that is mostly read-only, but there are some caveats. First, ReaderWriterLock is relatively poor performing compared to Monitor.Enter/Exit, which offsets some of the benefits.
Second, you need to be very sure that the data structures you are accessing
fully support multithreaded read access. Finally, there is apparently a bug in
the v1.1 ReaderWriterLock that can cause starvation
for writers when there are a large number of readers.
Ian Griffiths has some interesting discussion on ReaderWriterLock
here and here.
12. Tracing
12.1 Is there built-in support for tracing/logging?
Yes, in the System.Diagnostics namespace. There are
two main classes that deal with tracing - Debug and Trace. They both work in a
similar way - the difference is that tracing from the Debug class only works in
builds that have the DEBUG symbol defined, whereas tracing from the Trace class
only works in builds that have the TRACE symbol defined. Typically this means
that you should use System.Diagnostics.Trace.WriteLine
for tracing that you want to work in debug and release builds,
and System.Diagnostics.Debug.WriteLine for tracing
that you want to work only in debug builds.
12.2 Can I redirect tracing to a file?
Yes. The Debug and Trace classes both have a Listeners property, which is a
collection of sinks that receive the tracing that you send via Debug.WriteLine and Trace.WriteLine
respectively. By default the Listeners collection contains a single sink, which
is an instance of the DefaultTraceListener class.
This sends output to the Win32 OutputDebugString() function and also the System.Diagnostics.Debugger.Log()
method. This is useful when debugging, but if you're trying to trace a problem
at a customer site, redirecting the output to a file is more appropriate.
Fortunately, the TextWriterTraceListener class is
provided for this purpose.
Here's how to use the TextWriterTraceListener class
to redirect Trace output to a file:
Trace.Listeners.Clear();
FileStream fs
= new FileStream( @"c:\log.txt", FileMode.Create, FileAccess.Write
);
Trace.Listeners.Add( new TextWriterTraceListener( fs ) );
Trace.WriteLine( @"This will be writen to c:\log.txt!" );
Trace.Flush();
Note the use of Trace.Listeners.Clear() to remove the
default listener. If you don't do this, the output will go to the file and OutputDebugString(). Typically this is not what you want, because OutputDebugString() imposes a big performance hit.
12.3 Can I customise
the trace output?
Yes. You can write your own TraceListener-derived
class, and direct all output through it. Here's a simple example, which derives
from TextWriterTraceListener (and therefore has
in-built support for writing to files, as shown above) and adds timing
information and the thread ID for each trace line:
class MyListener : TextWriterTraceListener
{
public MyListener( Stream
s ) : base(s)
{
}
public override void WriteLine(
string s )
{
Writer.WriteLine(
"{0:D8} [{1:D4}] {2}",
Environment.TickCount
- m_startTickCount,
AppDomain.GetCurrentThreadId(),
s );
}
protected int m_startTickCount
= Environment.TickCount;
}
(Note that this implementation is not complete - the TraceListener.Write
method is not overridden for example.)
The beauty of this approach is that when an instance of MyListener
is added to the Trace.Listeners collection, all calls
to Trace.WriteLine() go through MyListener,
including calls made by referenced assemblies that know nothing about the MyListener class.
12.4 Are there any third party logging
components available?
Log4net is a port of the established log4j Java logging component.
13.1 How does .NET remoting
work?
.NET remoting involves sending messages along
channels. Two of the standard channels are HTTP and TCP. TCP is intended for
LANs only - HTTP can be used for LANs or WANs (internet).
Support is provided for multiple message serializarion
formats. Examples are SOAP (XML-based) and binary. By default, the HTTP channel
uses SOAP (via the .NET runtime Serialization SOAP Formatter), and the TCP
channel uses binary (via the .NET runtime Serialization Binary Formatter). But
either channel can use either serialization format.
There are a number of styles of remote access:
SingleCall. Each incoming request from a client is
serviced by a new object. The object is thrown away when the request has
finished.
Singleton. All incoming requests from clients are
processed by a single server object.
Client-activated object. This is the old stateful (D)COM model whereby the client receives a reference to the
remote object and holds that reference (thus keeping the remote object alive)
until it is finished with it.
Distributed garbage collection of objects is managed by a system called 'leased
based lifetime'. Each object has a lease time, and when that time expires the
object is disconnected from the .NET runtime remoting
infrastructure. Objects have a default renew time - the lease is renewed when a
successful call is made from the client to the object. The client can also
explicitly renew the lease.
If you're interested in using XML-RPC as an alternative to SOAP, take a look at
Charles Cook's XML-RPC.Net.
13.2 How can I get at the Win32 API from a
.NET program?
Use P/Invoke. This uses similar technology to COM Interop,
but is used to access static DLL entry points instead of COM objects. Here is
an example of C# calling the Win32 MessageBox
function:
using System;
using System.Runtime.InteropServices;
class MainApp
{
[DllImport("user32.dll",
EntryPoint="MessageBox",
SetLastError=true, CharSet=CharSet.Auto)]
public static extern int MessageBox(int
hWnd, String strMessage,
String strCaption, uint uiType);
public static void Main()
{
MessageBox(
0, "Hello, this is PInvoke in operation!",
".NET", 0 );
}
}
Pinvoke.net is a great resource for off-the-shelf P/Invoke signatures.
13.3 How do I write to the application
configuration file at runtime?
You don't. See http://www.interact-sw.co.uk/iangblog/2004/11/25/savingconfig.
13.4 What is the difference between an
event and a delegate?
An event is just a wrapper for a multicast delegate. Adding a public event to a
class is almost the same as adding a public multicast delegate field. In both
cases, subscriber objects can register for notifications, and in both cases the
publisher object can send notifications to the subscribers. However, a public
multicast delegate has the undesirable property that external objects can
invoke the delegate, something we'd normally want to restrict to the publisher.
Hence events - an event adds public methods to the containing class to add and
remove receivers, but does not make the invocation mechanism public.
See this post by Julien Couvreur
for more discussion.
13.5 What size is a .NET object?
Each instance of a reference type has two fields maintained by the runtime - a
method table pointer and a sync block. These are 4 bytes each on a 32-bit
system, making a total of 8 bytes per object overhead. Obviously the instance
data for the type must be added to this to get the overall size of the object.
So, for example, instances of the following class are 12 bytes each:
class MyInt
{
...
private int x;
}
However, note that with the current implementation of the CLR there seems to be
a minimum object size of 12 bytes, even for classes with no data (e.g. System.Object).
Values types have no equivalent overhead.
13.6 Will my .NET app run on 64-bit
Windows?
64-bit (x64) versions of Windows support both 32-bit and 64-bit processes, and
corresponding 32-bit and 64-bit versions of .NET 2.0. (.NET 1.1 is 32-bit
only).
.NET 1.x apps automatically run as 32-bit processes on 64-bit Windows.
.NET 2.0 apps can either run as 32-bit processes or as 64-bit processes. The OS
decides which to use based on the PE header of the executable. The flags in the
PE header are controlled via the compiler /platform switch, which allows the
target of the app to be specified as 'x86', 'x64' or 'any cpu'.
Normally you specify 'any cpu', and your app will run
as 32-bit on 32-bit Windows and 64-bit on 64-bit Windows. However if you have
some 32-bit native code in your app (loaded via COM interop,
for example), you will need to specify 'x86', which will force 64-bit Windows
to load your app in a 32-bit process. You can also tweak the 32-bit flag in the
PE header using the SDK corflags utility.
Some more explanation here:
http://blogs.msdn.com/gauravseth/archive/2006/03/07/545104.aspx
http://blogs.msdn.com/joshwil/archive/2005/04/08/406567.aspx
http://msdn.microsoft.com/netframework/programming/64bit/gettingstarted/
14. .NET 2.0
14.1 What are the new features of .NET 2.0?
Generics, anonymous methods, partial classes, iterators, property visibility (separate visibility for get
and set) and static classes. See http://msdn.microsoft.com/msdnmag/issues/04/05/C20/default.aspx
for more information about these features.
14.2 What are the new 2.0 features useful
for?
Generics are useful for writing efficient type-independent code, particularly
where the types might include value types. The obvious application is container
classes, and the .NET 2.0 class library includes a suite of generic container
classes in the System.Collections.Generic namespace.
Here's a simple example of a generic container class being used:
List<int> myList = new
List<int>();
myList.Add( 10 );
Anonymous methods reduce the amount of code you have to write when using
delegates, and are therefore especially useful for GUI programming. Here's an
example
AppDomain.CurrentDomain.ProcessExit +=
delegate { Console.WriteLine("Process ending
..."); };
Partial classes is a useful feature for separating machine-generated code from
hand-written code in the same class, and will therefore be heavily used by
development tools such as Visual Studio.
Iterators reduce the amount of code you need to write
to implement IEnumerable/IEnumerator. Here's some
sample code:
static void Main()
{
RandomEnumerator re = new
RandomEnumerator( 5 );
foreach( double r in re )
Console.WriteLine(
r );
Console.Read();
}
class RandomEnumerator : IEnumerable<double>
{
public RandomEnumerator(int
size) { m_size = size; }
public IEnumerator<double>
GetEnumerator()
{
Random rand = new Random();
for( int i=0;
i < m_size; i++ )
yield return rand.NextDouble();
}
int m_size = 0;
}
The use of 'yield return' is rather strange at first sight. It effectively synthethises an implementation of IEnumerator,
something we had to do manually in .NET 1.x.
14.3 What's the problem with .NET generics?
.NET generics work great for container classes. But what about
other uses? Well, it turns out that .NET generics have a major
limitation - they require the type parameter to be constrained. For example,
you cannot do this:
static class Disposer<T>
{
public static void Dispose(T obj)
{ obj.Dispose(); }
}
The C# compiler will refuse to compile this code, as the type T has not been
constrained, and therefore only supports the methods of System.Object.
Dispose is not a method on System.Object, so the
compilation fails. To fix this code, we need to add a where clause, to reassure
the compiler that our type T does indeed have a Dispose method
static class Disposer<T> where T :
IDisposable
{
public static void Dispose(T obj)
{ obj.Dispose(); }
}
The problem is that the requirement for explicit contraints
is very limiting. We can use constraints to say that T implements a particular
interface, but we can't dilute that to simply say that T implements a
particular method. Contrast this with C++ templates (for example), where no
constraint at all is required - it is assumed (and verified at compile time)
that if the code invokes the Dispose() method on a
type, then the type will support the method.
In fact, after writing generic code with interface constraints, we quickly see
that we haven't gained much over non-generic interface-based programming. For
example, we can easily rewrite the Disposer class without generics:
static class Disposer
{
public static void Dispose( IDisposable
obj ) { obj.Dispose(); }
}
For more on this topic, start by reading the following articles:
Bruce Eckel: http://www.mindview.net/WebLog/log-0050
Ian Griffiths: http://www.interact-sw.co.uk/iangblog/2004/03/14/generics
Charles Cook: http://www.cookcomputing.com/blog/archives/000425.html
14.4 What's new in the .NET 2.0 class library?
Here is a selection of new features in the .NET 2.0 class library:
Generic collections in the System.Collections.Generic
namespace.
The System.Nullable<T> type.
(Note that C# has special syntax for this type, e.g. int? is equivalent to Nullable<int>)
The GZipStream and DeflateStream classes in the System.IO.Compression
namespace.
The Semaphore class in the System.Threading
namespace.
Wrappers for DPAPI in the form of the ProtectedData
and ProtectedMemory classes in the System.Security.Cryptography namespace.
The IPC remoting channel in the System.Runtime.Remoting.Channels.Ipc namespace, for optimised intra-machine communication.
and many, many more. See http://msdn2.microsoft.com/en-us/library/t357fb32(en-US,VS.80).aspx
for a comprehensive list of changes.
1. How many languages
.NET is supporting now?
When
.NET was introduced it came with several languages. VB.NET,
C#, COBOL and Perl, etc. The site DotNetLanguages.Net says 44 languages
are supported.
2. How is .NET able to
support multiple languages?
A
language should comply with the Common Language Runtime standard to become a
.NET language. In .NET, code is compiled to Microsoft Intermediate Language
(MSIL for short). This is called as Managed Code. This Managed code is run in
.NET environment. So after compilation to this IL the language is not a
barrier. A code can call or use a function written in another language.
3. How ASP .NET different
from ASP?
Scripting
is separated from the HTML, Code is compiled as a DLL, these
DLLs can be executed on the server.
4. What is smart
navigation?
The
cursor position is maintained when the page gets refreshed due to the server
side validation and the page gets refreshed.
5. What is view state?
The web is stateless. But in ASP.NET, the state of a page is maintained in the
in the page itself automatically. How? The values are encrypted and saved in
hidden controls. this is done automatically by the
ASP.NET. This can be switched off / on for a single control.
6. How do you validate
the controls in an ASP .NET page?
Using special validation controls that are meant for this.
We have Range Validator, Email Validator.
7. Can the validation
be done in the server side? Or this can be done only in the Client side?
Client
side is done by default. Server side validation is also possible. We can switch
off the client side and server side can be done.
8. How to manage
pagination in a page?
Using pagination option in DataGrid control. We have to set the
number of records for a page, then it takes care of
pagination by itself.
9. What is
ADO.NET
is stateless mechanism. I can treat the ADO.Net as a separate in-memory
database where in I can use relationships between the tables and select insert
and updates to the database. I can update the actual database as a batch.
11. Observations
between VB.NET and VC#.NET?
Choosing a programming language depends on your language experience and the
scope of the application you are building. While small applications are often
created using only one language, it is not uncommon to develop large
applications using multiple languages.
For example, if you are extending an application with existing XML Web
services, you might use a scripting language with little or no programming
effort. For client-server applications, you would probably choose the single
language you are most comfortable with for the entire application. For new
enterprise applications, where large teams of developers create components and
services for deployment across multiple remote sites, the best choice might be
to use several languages depending on developer skills and long-term
maintenance expectations.
The .NET Platform programming languages - including Visual Basic
.NET, Visual C#, and Visual C++ with managed extensions, and many other
programming languages from various vendors - use .NET Framework services and
features through a common set of unified classes. The .NET unified classes
provide a consistent method of accessing the platform's functionality. If you
learn to use the class library, you will find that all tasks follow the same
uniform architecture. You no longer need to learn and master different API
architectures to write your applications.
In most situations, you can effectively use all of the Microsoft programming
languages. Nevertheless, each programming language has its relative strengths
and you will want to understand the features unique to each language. The
following sections will help you choose the right programming language for your
application.
Visual Basic .NET
Visual Basic .NET is the next generation of the Visual Basic language from
Microsoft. With Visual Basic you can build .NET applications, including Web
services and ASP.NET Web applications, quickly and easily. Applications made
with Visual Basic are built on the services of the common language runtime and
take advantage of the .NET Framework.
Visual Basic has many new and improved features such as inheritance,
interfaces, and overloading that make it a powerful object-oriented programming
language. Other new language features include free threading and structured
exception handling. Visual Basic fully integrates the .NET Framework and the
common language runtime, which together provide language interoperability,
garbage collection, enhanced security, and improved versioning support. A
Visual Basic support single inheritance and creates Microsoft intermediate
language (MSIL) as input to native code compilers.
Visual Basic is comparatively easy to learn and use, and Visual Basic has
become the programming language of choice for hundreds of thousands of
developers over the past decade. An understanding of Visual Basic can be leveraged
in a variety of ways, such as writing macros in Visual Studio and providing
programmability in applications such as Microsoft Excel, Access, and Word.
Visual Basic provides prototypes of some common project types, including:
• Windows Application.
• Class Library.
• Windows Control Library.
• ASP.NET Web Application.
• ASP.NET Web Service.
• Web Control Library.
• Console Application.
• Windows Service.
• Windows Service.
Visual C# .NET
Visual C# (pronounced C sharp) is designed to be a fast and easy way to create
.NET applications, including Web services and ASP.NET Web applications.
Applications written in Visual C# are built on the services of the common
language runtime and take full advantage of the .NET Framework.
C# is a simple, elegant, type-safe, object-oriented language recently developed
by Microsoft for building a wide range of applications. Anyone familiar with C
and similar languages will find few problems in adapting to C#. C# is designed
to bring rapid development to the C++ programmer without sacrificing the power
and control that are a hallmark of C and C++. Because of this heritage, C# has
a high degree of fidelity with C and C++, and developers familiar with these
languages can quickly become productive in C#. C# provides intrinsic code trust
mechanisms for a high level of security, garbage collection, and type safety.
C# supports single inheritance and creates Microsoft intermediate language
(MSIL) as input to native code compilers.
C# is fully integrated with the .NET Framework and the common language runtime,
which together provide language interoperability, garbage collection, enhanced
security, and improved versioning support. C# simplifies and modernizes some of
the more complex aspects of C and C++, notably namespaces, classes,
enumerations, overloading, and structured exception handling. C# also
eliminates C and C++ features such as macros, multiple inheritance, and virtual
base classes. For current C++ developers, C# provides a powerful,
high-productivity language alternative.
Visual C# provides prototypes of some common project types, including:
• Windows Application.
• Class Library.
• Windows Control Library.
• ASP.NET Web Application.
• ASP.NET Web Service.
• Web Control Library.
• Console Application.
• Windows Service.
12. Advantages of migrating to VB.NET ?
Visual Basic .NET has many new and improved language features — such as
inheritance, interfaces, and overloading that make it
a powerful object-oriented programming language. As a Visual Basic developer,
you can now create multithreaded, scalable applications using explicit
multithreading. Other new language features in Visual Basic .NET include
structured exception handling, custom attributes, and common language
specification (CLS) compliance.
The CLS is a set of rules that standardizes such things as data types and how
objects are exposed and interoperate. Visual Basic .NET adds several features
that take advantage of the CLS. Any CLS-compliant language can use the classes,
objects, and components you create in Visual Basic .NET. And you, as a Visual
Basic user, can access classes, components, and objects from other
CLS-compliant programming languages without worrying about language-specific
differences such as data types. CLS features used by Visual Basic .NET programs
include assemblies, namespaces, and attributes. These are the new features to
be stated briefly:
Inheritance
Visual Basic .NET supports inheritance by allowing you to define classes that
serve as the basis for derived classes. Derived classes inherit and can extend
the properties and methods of the base class. They can also override inherited
methods with new implementations. All classes created with Visual Basic .NET
are inheritable by default. Because the forms you design are really classes,
you can use inheritance to define new forms based on existing ones.
Exception Handling
Visual Basic .NET supports structured exception handling, using an enhanced
version of the Try...Catch...Finally syntax supported by other languages such
as C++.
Structured exception handling combines a modern control structure (similar to
Select Case or While) with exceptions, protected blocks of code, and filters.
Structured exception handling makes it easy to create and maintain programs
with robust, comprehensive error handlers.
Overloading
Overloading is the ability to define properties, methods, or procedures that
have the same name but use different data types. Overloaded procedures allow
you to provide as many implementations as necessary to handle different kinds
of data, while giving the appearance of a single, versatile procedure.
Overriding Properties and Methods The Overrides
keyword allows derived objects to override characteristics inherited from
parent objects. Overridden members have the same arguments as the members
inherited from the base class, but different implementations. A member's new
implementation can call the original implementation in the parent class by
preceding the member name with MyBase.
Constructors and Destructors
Constructors are procedures that control initialization of new instances of a
class. Conversely, destructors are methods that free system resources when a
class leaves scope or is set to Nothing. Visual Basic
.NET supports constructors and destructors using the Sub New and Sub Finalize
procedures.
Data Types
Visual Basic .NET introduces three new data types. The Char data type is an
unsigned 16-bit quantity used to store Unicode characters. It is equivalent to
the .NET Framework System. Char data type. The Short data type, a signed 16-bit
integer, was named Integer in earlier versions of Visual Basic. The Decimal
data type is a 96-bit signed integer scaled by a variable power of 10. In
earlier versions of Visual Basic, it was available only within a Variant.
Interfaces
Interfaces describe the properties and methods of classes, but unlike classes,
do not provide implementations. The Interface statement allows you to declare
interfaces, while the Implements statement lets you write code that puts the
items described in the interface into practice.
Delegates
Delegates objects that can call the methods of objects on your behalf are
sometimes described as type-safe, object-oriented function pointers. You can
use delegates to let procedures specify an event handler method that runs when
an event occurs. You can also use delegates with multithreaded applications.
For details, see Delegates and the AddressOf
Operator.
Shared Members
Shared members are properties, procedures, and fields that are shared by all
instances of a class. Shared data members are useful when multiple objects need
to use information that is common to all. Shared class methods can be used
without first creating an object from a class.
References
References allow you to use objects defined in other assemblies. In Visual Basic
.NET, references point to assemblies instead of type libraries. For details,
see References and the Imports Statement. Namespaces Namespaces
prevent naming conflicts by organizing classes, interfaces, and methods into
hierarchies.
Assemblies
Assemblies replace and extend the capabilities of type libraries by, describing
all the required files for a particular component or application. An assembly
can contain one or more namespaces.
Attributes
Attributes enable you to provide additional information about program elements.
For example, you can use an attribute to specify which methods in a class
should be exposed when the class is used as a XML Web service. Multithreading
Visual Basic .NET allows you to write applications that can perform multiple
tasks independently. A task that has the potential of holding up other tasks
can execute on a separate thread, a process known as multithreading. By causing
complicated tasks to run on threads that are separate from your user interface,
multithreading makes your applications more responsive to user input.
13. Advantages of
VB.NET
First of all, VB.NET provides managed code execution that runs under the Common
Language Runtime (CLR), resulting in robust, stable and secure applications.
All features of the .NET framework are readily available in VB.NET.
VB.NET is totally object oriented. This is a major addition that VB6 and other
earlier releases didn't have.
The .NET framework comes with ADO.NET, which follows the disconnected paradigm,
i.e. once the required records are fetched the connection no longer exists. It
also retrieves the records that are expected to be accessed in the immediate
future. This enhances Scalability of the application to a great extent.
VB.NET uses XML to transfer data between the various layers in the DNA
Architecture i.e. data are passed as simple text strings.
Error handling has changed in VB.NET. A new Try-Catch-Finally block has been
introduced to handle errors and exceptions as a unit, allowing appropriate
action to be taken at the place the error occurred thus discouraging the use of
ON ERROR GOTO statement. This again credits to the maintainability of the code.
Another great feature added to VB.NET is free threading against the VB
single-threaded apartment feature. In many situations developers need spawning
of a new thread to run as a background process and increase the usability of
the application. VB.NET allows developers to spawn threads wherever they feel
like, hence giving freedom and better control on the application.
Security has become more robust in VB.NET. In addition to the role-based
security in VB6, VB.NET comes with a new security model, Code Access security.
This security controls on what the code can access. For example you can set the
security to a component such that the component cannot access the database.
This type of security is important because it allows building components that
can be trusted to various degrees.
The CLR takes care of garbage collection i.e. the CLR releases resources as
soon as an object is no more in use. This relieves the developer from thinking
of ways to manage memory. CLR does this for them.
14. Using ActiveX Control in .Net
ActiveX control is a special type of COM component that supports a User
Interface. Using ActiveX Control in your .Net Project is even easier than using
COM component. They are bundled usually in .ocx
files. Again a proxy assembly is made by .Net utility AxImp.exe (which we will
see shortly) which your application (or client) uses as if it is a .Net control
or assembly.
Making Proxy Assembly For ActiveX Control: First, a proxy assembly is made
using AxImp.exe (acronym for ActiveX Import) by writing following command on
Command Prompt:
C:>AxImp C:MyProjectsMyControl.ocx
This command will make two dlls, e.g., in case of
above command
MyControl.dll
AxMyControl.dll
The first file MyControl.dll is a .Net assembly proxy, which allows you to
reference the ActiveX as if it were non-graphical object.
The second file AxMyControl.dll is the Windows Control, which allows u to use
the graphical aspects of activex control and use it
in the Windows Form Project.
Adding Reference of ActiveX Proxy Assembly in your Project Settings: To add a
reference of ActiveX Proxy Assembly in our Project, do this:
o Select ProjectàAdd Reference (Select Add Reference
from Project Menu).
o This will show you a dialog box, select .Net tab
from the top of window.
o Click Browse button on the top right of window.
o Select the dll file for your ActiveX Proxy Assembly
(which is MyControl.dll) and click OK o Your selected component is now shown in
the ‘Selected Component’ List Box. Click OK again Some More On
Using COM or ActiveX in .Net
.Net only provides wrapper class or proxy assembly (Runtime Callable Wrapper or
RCW) for COM or activeX control. In the background,
it is actually delegating the tasks to the original COM, so it does not convert
your COM/activeX but just imports them.
A good thing about .Net is that when it imports a component, it also imports
the components that are publically referenced by that
component. So, if your component, say MyDataAcsess.dll references ADODB.dll
then .Net will automatically import that COM component too!
The Visual Studio.NET does surprise you in a great deal when u see that it is applying its intellisense
(showing methods, classes, interfaces, properties when placing dot) even on
your imported COM components!!!! Isn’t it a magic or what?
When accessing thru RCW, .Net client has no knowledge that it is using COM
component, it is presented just as another C# assembly.
U can also import COM component thru command prompt (for reference see
Professional C# by Wrox) U can also use your .Net
components in COM, i.e., export your .net components (for reference see
Professional C# by Wrox)
15. What is Machine.config?
Machine configuration file: The machine.config file
contains settings that apply to the entire computer. This file is located in
the %runtime install path%Config directory. There is
only one machine.config file on a computer. The Machine.Config file found in the "CONFIG"
subfolder of your .NET Framework install directory (c:WINNTMicrosoft.NETFramework{Version Number}CONFIG on
Windows 2000 installations). The machine.config,
which can be found in the directory
$WINDIR$Microsoft.NETFrameworkv1.0.3705CONFIG, is an XML-formatted
configuration file that specifies configuration options for the machine. This
file contains, among many other XML elements, a browserCaps
element. Inside this element are a number of other elements that specify parse rules for the various User-Agents, and what properties
each of these parsings supports.
For example, to determine what platform is used, a filter element is used that
specifies how to set the platform property based on what platform name is found
in the User-Agent string. Specifically, the machine.config
file contains:
platform=Win95
platform=Win98
platform=WinNT
...
That is, if in the User-Agent string the string "Windows 95" or
"Win95" is found, the platform property is set to Win95. There are a
number of filter elements in the browserCaps element
in the machine.config file that define the various
properties for various User-Agent strings.
Hence, when using the Request.Browser property to
determine a user's browser features, the user's agent string is matched up to
particular properties in the machine.config file. The
ability for being able to detect a user's browser's capabilities, then, is
based upon the honesty in the browser's sent User-Agent string. For example,
Opera can be easily configured to send a User-Agent string that makes it appear
as if it's IE 5.5. In this case from the Web server's perspective (and, hence,
from your ASP.NET Web page's perspective), the user is visiting using IE 5.5,
even though, in actuality, he is using Opera.
16. What is Web.config?
In classic ASP all Web site related information was stored in the metadata of
IIS. This had the disadvantage that remote Web developers couldn't easily make
Web-site configuration changes. For example, if you want to add a custom 404
error page, a setting needs to be made through the IIS admin tool, and you're
Web host will likely charge you a flat fee to do this for you. With ASP.NET,
however, these settings are moved into an XML-formatted text file (Web.config) that resides in the Web site's root directory.
Through Web.config you can specify settings like
custom 404 error pages, authentication and authorization settings for the Web sitempilation options for the ASP.NET Web pages, if tracing
should be enabled, etc.
The Web.config file is an XML-formatted file. At the
root level is the tag. Inside this tag you can add a number of other tags, the
most common and useful one being the system.web tag,
where you will specify most of the Web site configuration parameters. However,
to specify application-wide settings you use the tag.
For example, if we wanted to add a database connection string parameter we
could have a Web.config file like so.
17. What is the difference between
1. Providing a comprehensive disconnected
data-access model, which is crucial to the Web environment
2. Providing tight integration with XML, and
3. Providing seamless integration with the .NET
Framework (e.g., compatibility with the base class library's type system).
From an ADO.NET implementation perspective, the Recordset
object in
In
corresponds to a single database table or view. In this way, a dataset can
mimic the structure of the underlying database. In
There is one significant difference between disconnected processing in
17. What is the difference between VB and
VB.NET?
Now VB.NET is object-oriented language. The following are some of the
differences:
Data Type Changes
The .NET platform provides Common Type System to all
the supported languages. This means that all the languages must support the
same data types as enforced by common language runtime. This eliminates data
type incompatibilities between various languages. For example on the 32-bit
Windows platform, the integer data type takes 4 bytes in languages like C++
whereas in VB it takes 2 bytes. Following are the main changes related to data
types in VB.NET:
. Under .NET the integer data type in VB.NET is also 4 bytes in size.
. VB.NET has no currency data type. Instead it provides decimal as a
replacement.
. VB.NET introduces a new data type called Char. The char data type takes 2
bytes and can store Unicode characters.
. VB.NET do not have Variant data type. To achieve a
result similar to variant type you can use Object data type. (Since every thing
in .NET including primitive data types is an object, a variable of object type
can point to any data type).
. In VB.NET there is no concept of fixed length strings.
. In VB6 we used the Type keyword to declare our user-defined structures.
VB.NET introduces the structure keyword for the same purpose.
Declaring Variables
Consider this simple example in VB6:
Dim x,y as integer
In this example VB6 will consider x as variant and y as integer, which is
somewhat odd behavior. VB.NET corrects this problem, creating both x and y as
integers.
Furthermore, VB.NET allows you to assign initial values to the variables in the
declaration statement itself:
Dim str1 as string = Hello
VB.NET also introduces Read-Only variables. Unlike constants Read-Only
variables can be declared without initialization but once you assign a value to
it, it cannot be changes.
Initialization here
Dim readonly x as integer
In later code
X=100
Now x can’t be changed
X=200 *********** Error **********
Property Syntax
In VB.NET, we anymore don't have separate declarations for Get and Set/Let.
Now, everything is done in a single property declaration. This can be better
explained by the following example.
Public [ReadOnly | WriteOnly]
Property PropertyName as Datatype
Get
Return m_var
End Get
Set
M_var = value
End Set
End Property
Example:
Private _message as String
Public Property Message As String
Get
Return _message
End Get
Set
_message = Value
End Set
End Property
ByVal is the default - This is a crucial difference betwen VB 6.0 and VB.NET, where the default in VB 6.0 was
by reference. But objects are still passed by reference.
Invoking Subroutines In previous versions of VB, only functions required the
use of parentheses around the parameter list. But in VB.NET all function or
subroutine calls require parentheses around the parameter list. This also
applies, even though the parameter list is empty.
User-Defined Types - VB.NET does away with the keyword Type and replaces it
with the keyword Structure
Public Structure Student
Dim strName as String
Dim strAge as Short
End Structure
Procedures and Functions
In VB6 all the procedure parameters are passed by reference (ByRef) by default. In VB.NET they are passed by value (ByVal) by default. Parantheses
are required for calling procedures and functions whether they accept any
parameters or not. In VB6 functions returned values using syntax like: FuntionName = return_value. In
VB.NET you can use the Return keyword (Return return_value)
to return values or you can continue to use the older syntax, which is still
valid.
Scoping VB.NET now supports block-level scoping of variables. If your programs
declare all of the variables at the beginning of the function or subroutine,
this will not be a problem. However, the following VB 6.0 will cause an issue
while upgrading to VB .NET
Do While objRs.Eof
Dim J as Integer
J=0
If objRs("flag")="Y"
then
J=1
End If
objRs.MoveNext
Wend
If J Then
Msgbox "Flag is Y"
End If
In the above example the variable J will become out of scope just after the
loop, since J was declared inside the While loop.
Exception Handling
The most wanted feature in earlier versions of VB was its error handling
mechanism. The older versions relied on error handlers such as "On Error GoTo and On Error Resume Next. VB.NET provides us with a
more stuructured approach. The new block structure
allows us to track the exact error at the right time. The new error handling
mechanism is refered to as
Try...Throw...Catch...Finally. The following example will explain this new
feature.
Sub myOpenFile()
Try
Open "myFile" For Output As #1
Write #1, myOutput
Catch
Kill "myFile"
Finally
Close #1
End try
End Sub
The keyword SET is gone - Since everything in VB.NET is an object. So the
keyword SET is not at all used to differentiate between a simple variable
assignment and an object assignment. So, if you have the following statement in
VB 6.0
Set ObjConn = Nothing
Should be replaced as
ObjConn = Nothing.
Constructor and Destructor
The constructor procedure is one of the many new
object-oriented features of VB.NET. The constructor in VB.NET replaces the Class_Initialize in VB 6.0. All occurance
of Class_Initialize in previous versions of VB should
now be placed in a class constructor. In VB.NET, a constructor is added to a
class by adding a procedure called New. We can also create a class destructor,
which is equivalent to Class_Terminate event in VB
6.0, by adding a sub-procedure called Finalize to our class. Usage of Return In VB.NET, we can use the keyword return to return a value
from any function. In previous versions, we used to assign the value back with
the help of the function name itself. The following example explains this:
Public Function Sum (intNum1 as Integer, intNum2 as Integer) as Integer
Dim intSum as Integer
intSum = intNum1 + intNum2
Return intSum
End Function
Static Methods
VB.NET now allows you to create static methods in your classes. Static methods
are methods that can be called without requiring the developer to create
instance of the class. For example, if you had a class named Foo with the non-static method NonStatic()
and the static method Static(), you could call the Static() method like so:
Foo.Static()
However, non-static methods require than an instance of the class be created,
like so:
Create an instance of the Foo class
Dim objFoo as New Foo()
Execute the NonStatic() method
ObjFoo.NonStatic()
To create a static method in a VB.NET, simply prefix the method definition with
the keyword Shared.
19. What is a Manifest?
An assembly manifest contains all the metadata needed to specify the assembly's
version requirements and security identity, and all metadata needed to define
the scope of the assembly and resolve references to resources and classes. The
assembly manifest can be stored in either a PE (Portable Executable) file (an .exe
or .dll) with Microsoft intermediate language (MSIL) code or in a standalone PE
(Portable Executable) file that contains only assembly manifest information.
The following table shows the information contained in the assembly manifest.
The first four items the assembly name, version number, culture, and strong
name information make up the assembly's identity. Assembly name: A text string
specifying the assembly's name. Version number: A major and minor version
number, and a revision and build number. The common language runtime uses these
numbers to enforce version policy.
Culture: Information on the culture or language the assembly supports. This
information should be used only to designate an assembly as a satellite
assembly containing culture- or language-specific information. (An assembly
with culture information is automatically assumed to be a satellite assembly.)
Strong name information: The public key from the publisher if the assembly has
been given a strong name. List of all files in the assembly: A hash of each
file contained in the assembly and a file name. Note that all files that make
up the assembly must be in the same directory as the file containing the
assembly manifest. Type reference information: Information
used by the runtime to map a type reference to the file that contains its
declaration and implementation. This is used for types that are exported
from the assembly.
Information on referenced assemblies: A list of other assemblies that are
statically referenced by the assembly. Each reference includes the dependent
assembly's name, assembly metadata (version, culture, operating system, and so
on), and public key, if the assembly is strong named.
20. Creating a Key Pair?
You can create a key pair using the Strong Name tool (Sn.exe). Key pair files
usually have an .snk
extension. To create a key pair At the command prompt, type the following
command:
sn k
In this command, file name is the name of the output file containing the key
pair. The following example creates a key pair called sgKey.snk.
sn -k sgKey.snk
21. What is the difference between "using System.Data;" and
directly adding the reference from "Add References Dialog Box"?
When u compile a program using command line, u add the
references using /r switch. When you compile a program using Visual Studio, it
adds those references to our assembly, which are added using "Add
Reference" dialog box. While "using" statement facilitates us to
use classes without using their fully qualified names.
For example: if u have added a reference to "System.Data.SqlClient"
using "Add Reference" dialog box then u can use SqlConnection
class like this:
System.Data.SqlClient.SqlConnection
But if u add a "using System.Data.SqlClient"
statement at the start of ur code then u can directly use SqlConnection
class.
On the other hand if u add a reference using "using System.Data.SqlClient"
statement, but don't add it using "Add Reference" dialog box, Visual
Studio will give error message while we compile the program.
22. What is GAC?
The global assembly cache stores assemblies specifically designated to be
shared by several applications on the computer. You should share assemblies by
installing them into the global assembly cache only when you need to.
Assemblies deployed in the global assembly cache must have a strong name. When
an assembly is added to the global assembly cache, integrity checks are
performed on all files that make up the assembly. The cache performs these
integrity checks to ensure that an assembly has not been tampered with, for example,
when a file has changed but the manifest does not reflect the change. Use a
developer tool called the Global Assembly Cache tool (Gacutil.exe), provided by
the .NET Framework SDK or Use Windows Explorer to drag assemblies into the
cache. To install a strong-named assembly into the global assembly cache At the
command prompt, type the following command:
gacutil I In this command, assembly name is the name
of the assembly to install in the global assembly cache.
23. What is a Metadata?
Metadata is information about a PE. In COM, metadata is communicated through
non-standardized type libraries. In .NET, this data is contained in the header
portion of a COFF-compliant PE and follows certain guidelines; it contains
information such as the assembly’s name, version, language (spoken, not computera.k.a.,
culture), what external types are referenced, what internal types are exposed,
methods, properties, classes, and much more. The CLR uses metadata for a number
of specific purposes. Security is managed through a public key in the PE’s
header. Information about classes, modules, and so forth allows the CLR to know
in advance what structures are necessary. The class loader component of the CLR
uses metadata to locate specific classes within assemblies, either locally or
across networks. Just-in-time (JIT) compilers use the metadata to turn IL into
executable code. Other programs take advantage of metadata as well. A common
example is placing a Microsoft Word document on a Windows 2000 desktop. If the
document file has completed comments, author, title, or other Properties
metadata, the text is displayed as a tool tip when a user hovers
the mouse over the document on the desktop. You can use the Ildasm.exe utility
to view the metadata in a PE. Literally, this tool is an IL disassembler.
24. What is managed code and managed data?
Managed code is code that is written to target the services of the Common
Language Runtime. In order to target these services, the code must provide a
minimum level of information (metadata) to the runtime. All C#, Visual Basic
.NET, and JScript .NET code is managed by default.
Visual Studio .NET C++ code is not managed by default, but the compiler can
produce managed code by specifying a command-line switch (/CLR). Closely
related to managed code is managed data--data that is allocated and de-
allocated by the Common Language Runtime's garbage collector. C#, Visual Basic,
and JScript .NET data is managed by default. C# data
can, however, be marked as unmanaged through the use of special keywords.
Visual Studio .NET C++ data is unmanaged by default (even when using the /CLR
switch), but when using Managed Extensions for C++, a class can be marked as
managed using the __gc keyword. As the name suggests,
this means that the memory for instances of the class is managed by the garbage
collector. In addition, the class becomes a full participating member of the
.NET Framework community, with the benefits and restrictions that it brings. An
example of a benefit is proper interoperability with classes written in other
languages (for example, a managed C++ class can inherit from a Visual Basic
class). An example of a restriction is that a managed class can only inherit
from one base class.
25. What is .NET / .NET Framework?
It is a Framework in which Windows applications may be developed and run. The
Microsoft .NET Framework is a platform for building, deploying, and running Web
Services and applications. It provides a highly productive, standards-based,
multi-language environment for integrating existing investments with
next-generation applications and services as well as the agility to solve the
challenges of deployment and operation of Internet-scale applications. The .NET
Framework consists of three main parts: the common language runtime, a hierarchical
set of unified class libraries, and a componentized version of Active Server
Pages called ASP.NET. The .NET Framework provides a new programming model and
rich set of classes designed to simplify application development for Windows,
the Web, and mobile devices. It provides full support for XML Web services,
contains robust security features, and delivers new levels of programming
power. The .NET Framework is used by all Microsoft languages including Visual
C#, Visual J#, and Visual C++.
26. What is Reflection?
It extends the benefits of metadata by allowing developers to inspect and use
it at runtime. For example, dynamically determine all the classes contained in
a given assembly and invoke their methods. Reflection provides objects that
encapsulate assemblies, modules, and types. You can use reflection to
dynamically create an instance of a type, bind the type to an existing object,
or get the type from an existing object. You can then invoke the type's methods
or access its fields and properties. Namespace: System.Reflection
27. What is "Common Type System" (CTS)?
CTS defines all of the basic types that can be used in
the .NET Framework and the operations performed on those type.
All this time we have been talking about language interoperability, and .NET
Class Framework. None of this is possible without all the language sharing the
same data types. What this means is that an int should mean the same in VB,
VC++, C# and all other .NET compliant languages. This is achieved through
introduction of Common Type System (CTS).
28. What is "Common Language Specification" (CLS)?
CLS is the collection of the rules and constraints that every language (that
seeks to achieve .NET compatibility) must follow. It is a subsection of CTS and
it specifies how it shares and extends one another libraries.
29. What is "Common Language Runtime" (CLR)?
CLR is .NET equivalent of Java Virtual Machine (JVM). It is the runtime that
converts a MSIL code into the host machine language code, which is then
executed appropriately. The CLR is the execution engine for .NET Framework
applications. It provides a number of services, including:
- Code management (loading and execution)<
> - Application memory isolation
- Verification of type safety
- Conversion of IL to native code.
- Access to metadata (enhanced type informmatiion)
- Managing memory for managed objects
- Enforcement of code access security
- Exception handling, including cross-
- Interoperation between managed code, COMMM obbjects,
and pre-existing DLL's (unmanaged code and data)
- Automation of object layout
- Support for developer services (profilinng,
debugging, and so on).
30. What are Attributes?
Attributes are declarative tags in code that insert additional metadata into an
assembly. There exist two types of attributes in the .NET Framework: Predefined
attributes such as AssemblyVersion, which already
exist and are accessed through the Runtime Classes; and custom attributes,
which you write yourself by extending the System.Attribute
class.
31. What are the Types of Assemblies?
Assemblies are of two types:
1. Private Assemblies
2. Shared Assemblies
Private Assemblies: The assembly is intended only for one application. The
files of that assembly must be placed in the same folder as the application or
in a sub folder. No other application will be able to make a call to this
assembly. The advantage of having a private assembly is that, it makes naming
the assembly very easy, since the developer need not worry about name clashes
with other assemblies. As long as the assembly has a unique name within the
concerned application, there won't be any problems.
Shared Assemblies: If the assembly is to be made into a Shared Assembly, then
the naming conventions are very strict since it has to be unique across the
entire system. The naming conventions should also take care of newer versions
of the component being shipped. These are accomplished by giving the assembly a
Shared Name. Then the assembly is placed in the global assembly cache, which is
a folder in the file system reserved for shared assemblies.
32. What is an Intermediate language?
Assemblies are made up of IL code modules and the metadata that describes them.
Although programs may be compiled via an IDE or the command line, in fact, they
are simply translated into IL, not machine code. The actual machine code is not
generated until the function that requires it is called. This is the
just-in-time, or JIT, compilation feature of .NET. JIT compilation happens at
runtime for a variety of reasons, one of the most ambitious being Microsoft's
desire for cross-platform .NET adoption. If a CLR is built
for another operating system (UNIX or Mac), the same assemblies will run in
addition to the Microsoft platforms. The hope is that .NET assemblies
are write-once-run-anywhere applications. This is a .NET feature that works
behind-the-scenes, ensuring that developers are not limited to writing
applications for one single line of products. No one has demonstrated whether
or not this promise will ever truly materialize. CTS/CLS
The MSIL Instruction Set Specification is included with the .NET SDK, along
with the IL Assembly Language Programmers Reference. If a developer wants to
write custom .NET programming languages, these are the necessary specifications
and syntax. The CTS and CLS define the types and syntaxes that every .NET
language needs to embrace. An application may not expose these features, but it
must consider them when communicating through IL.
33. ASP.NET Authentication Providers and
IIS Security
ASP.NET implements authentication using authentication providers, which are
code modules that verify credentials and implement other security functionality
such as cookie generation. ASP.NET supports the following three authentication
providers:
Forms Authentication: Using this provider causes unauthenticated requests to be
redirected to a specified HTML form using client side redirection. The user can
then supply logon credentials, and post the form back to the server. If the
application authenticates the request (using application-specific logic),
ASP.NET issues a cookie that contains the credentials or a key for reacquiring
the client identity. Subsequent requests are issued with the cookie in the
request headers, which means that subsequent authentications are unnecessary.
Passport Authentication: This is a centralized authentication service provided
by Microsoft that offers a single logon facility and membership services for
participating sites. ASP.NET, in conjunction with the Microsoft® Passport
software development kit (SDK), provides similar functionality as Forms
Authentication to Passport users.
Windows Authentication: This provider utilizes the authentication capabilities
of IIS. After IIS completes its authentication, ASP.NET uses the authenticated
identity's token to authorize access.
To enable a specified authentication provider for an ASP.NET application, you
must create an entry in the application's configuration file as follows:
// web.config file
34. What is the difference between ASP and ASP.NET?
ASP is interpreted. ASP.NET Compiled event base programming.
Control events for text button can be handled at client javascript
only. Since we have server controls events can handle at server side.
More error handling.
ASP .NET has better language support, a large set of new controls and XML based
components, and better user authentication.
ASP .NET provides increased performance by running compiled code.
ASP .NET code is not fully backward compatible with ASP.
ASP .NET also contains a new set of object oriented input controls, like
programmable list boxes, validation controls.
A new data grid control supports sorting, data paging, and everything you
expect from a dataset control. The first request for an ASP.NET page on the
server will compile the ASP .NET code and keep a cached copy in memory. The
result of this is greatly increased performance.
ASP .NET is not fully compatible with earlier versions of ASP, so most of the
old ASP code will need some changes to run under ASP .NET. To overcome this
problem, ASP .NET uses a new file extension ".aspx". This will make
ASP .NET applications able to run side by side with standard ASP applications
on the same server.
35. Using COM Component in .Net
As most of you know that .Net does not encourage the development of COM
components and provides a different solution to making reusable components
through Assemblies. But, there are a lot of COM
components present which our .Net application might need to use. Fortunately,
.Net provides an extremely simple approach to achieve this. This is achieved by
using ‘Wrapper Classes’ and ‘Proxy Components’. .Net wraps the COM component
into .Net assembly technically called ‘Runtime Callable Wrapper’ or RCW. Then u
can call and use your COM component just as a .Net (or C#, if u are using C#)
Assembly.
36. What is an assembly?
An assembly is the primary building block of a .NET Framework application. It
is a collection of functionality that is built, versioned, and deployed as a
single implementation unit (as one or more files). All managed types and
resources are marked either as accessible only within their implementation unit, or as accessible by code outside that unit. .NET
Assembly contains all the metadata about the modules, types, and other elements
it contains in the form of a manifest. The CLR loves assemblies because
differing programming languages are just perfect for creating certain kinds of
applications. For example, COBOL stands for Common Business-Oriented Language
because it’s tailor-made for creating business apps. However, it’s not much
good for creating drafting programs. Regardless of what language you used to
create your modules, they can all work together within one Portable Executable
Assembly. There’s a hierarchy to the structure of .NET code. That hierarchy is
Assembly - > Module -> Type -> Method." Assemblies can be static
or dynamic. Static assemblies can include .NET Framework types (interfaces and
classes), as well as resources for the assembly (bitmaps, JPEG files, resource
files, and so on). Static assemblies are stored on disk in portable executable
(PE) files. You can also use the .NET Framework to create dynamic assemblies,
which are run directly from memory and are not saved to disk before execution.
You can save dynamic assemblies to disk after they have executed.
37. What is a Web Service?
A web service is a software component that exposes itself through the open
communication channels of the Internet. Applications running on remote
machines, on potentially different platforms, can access these components in a
language and platform-independent manner. A Web Service is a group of
functions, packaged together for use in a common framework throughout a
network.
40. What is Delegation?
A delegate acts like a strongly type function pointer. Delegates can invoke the
methods that they reference without making explicit calls to those methods.
Delegate is an entity that is entrusted with the task of representation, assign
or passing on information. In code sense, it means a Delegate is entrusted with
a Method to report information back to it when a certain task (which the Method
expects) is accomplished outside the Method's class.
41. What is "Microsoft Intermediate Language" (MSIL)?
A .NET programming language (C#, VB.NET, J# etc.) does not compile into
executable code; instead it compiles into an intermediate code called Microsoft
Intermediate Language (MSIL). As a programmer one need not worry about the
syntax of MSIL - since our source code in automatically converted to MSIL. The
MSIL code is then send to the CLR (Common Language Runtime) that converts the
code to machine language, which is, then run on the
host machine. MSIL is similar to Java Byte code. MSIL is the CPU-independent
instruction set into which .NET Framework programs are compiled. It contains
instructions for loading, storing, initializing, and calling methods on
objects. Combined with metadata and the common type system, MSIL allows for
true cross- language integration Prior to execution,
MSIL is converted to machine code. It is not interpreted.
42. Differences between Datagrid, Datalist and Repeater?
1. Datagrid has paging while Datalist
doesnt.
2. Datalist has a property called repeat. Direction =
vertical/horizontal. (This is of great help in designing layouts). This is not
there in Datagrid.
3. A repeater is used when more intimate control over html generation is
required.
4. When only checkboxes/radiobuttons are repeatedly
served then a checkboxlist or radiobuttonlist
are used as they involve fewer overheads than a Datagrid.
The Repeater repeats a chunk of HTML you write, it has the least functionality
of the three. DataList is the next step up from a
Repeater; accept you have very little control over the HTML that the control
renders. DataList is the first of the three controls
that allow you Repeat-Columns horizontally or vertically. Finally, the DataGrid
is the motherload. However, instead of working on a
row-by-row basis, you’re working on a column-by-column basis. DataGrid caters
to sorting and has basic paging for your disposal. Again you have little contro, over the HTML. NOTE: DataList
and DataGrid both render as HTML tables by default. Out of the 3 controls, I
use the Repeater the most due to its flexibility w/ HTML. Creating a Pagination
scheme isn't that hard, so I rarely if ever use a DataGrid.
Occasionally I like using a DataList because it
allows me to easily list out my records in rows of three for instance
40. What is Delegation?
A delegate acts like a strongly type function pointer. Delegates can invoke the
methods that they reference without making explicit calls to those methods.
Delegate is an entity that is entrusted with the task of representation, assign
or passing on information. In code sense, it means a Delegate is entrusted with
a Method to report information back to it when a certain task (which the Method
expects) is accomplished outside the Method's class.
41. What is "Microsoft Intermediate Language" (MSIL)?
A .NET programming language (C#, VB.NET, J# etc.) does not compile into
executable code; instead it compiles into an intermediate code called Microsoft
Intermediate Language (MSIL). As a programmer one need not worry about the
syntax of MSIL - since our source code in automatically converted to MSIL. The
MSIL code is then send to the CLR (Common Language Runtime) that converts the
code to machine language, which is, then run on the
host machine. MSIL is similar to Java Byte code. MSIL is the CPU-independent
instruction set into which .NET Framework programs are compiled. It contains
instructions for loading, storing, initializing, and calling methods on
objects. Combined with metadata and the common type system, MSIL allows for
true cross- language integration Prior to execution,
MSIL is converted to machine code. It is not interpreted.
42. Differences between Datagrid, Datalist and Repeater?
1. Datagrid has paging while Datalist
doesnt.
2. Datalist has a property called repeat. Direction =
vertical/horizontal. (This is of great help in designing layouts). This is not
there in Datagrid.
3. A repeater is used when more intimate control over html generation is
required.
4. When only checkboxes/radiobuttons are repeatedly
served then a checkboxlist or radiobuttonlist
are used as they involve fewer overheads than a Datagrid.
The Repeater repeats a chunk of HTML you write, it has the least functionality
of the three. DataList is the next step up from a
Repeater; accept you have very little control over the HTML that the control
renders. DataList is the first of the three controls
that allow you Repeat-Columns horizontally or vertically. Finally, the DataGrid
is the motherload. However, instead of working on a
row-by-row basis, you’re working on a column-by-column basis. DataGrid caters
to sorting and has basic paging for your disposal. Again you have little contro, over the HTML. NOTE: DataList
and DataGrid both render as HTML tables by default. Out of the 3 controls, I
use the Repeater the most due to its flexibility w/ HTML. Creating a Pagination
scheme isn't that hard, so I rarely if ever use a DataGrid.
Occasionally I like using a DataList because it
allows me to easily list out my records in rows of three for instance
43. What are the Application_Start
and Session_Start subroutines used for?
This is where you can set the specific variables for the Application and
Session objects.
44. Can you explain what inheritance is and an example of when you might use
it?
When you want to inherit (use the functionality of) another
class. Example: With a base class named Employee, a Manager class
could be derived from the Employee base class.
45. Whats an assembly?
Assemblies are the building blocks of the .NET framework.
Describe the difference between inline and code behind.
Inline code written along side the html in a page.
Code-behind is code written in a separate file and referenced by the .aspx
page.
46. Explain what a diffgram is,
and a good use for one?
The DiffGram is one of the two XML formats that you
can use to render DataSet object contents to
XML. A good use is reading database data to an XML file to be sent to a
Web Service.
47. Whats MSIL, and why should my developers
need an appreciation of it if at all?
MSIL is the Microsoft Intermediate Language. All .NET compatible languages will
get converted to MSIL. MSIL also allows the .NET Framework to JIT compile the assembly on the installed computer.
48. Which method do you invoke on the DataAdapter
control to load your generated dataset with data?
The Fill() method.
Can you edit data in the Repeater control?
No, it just reads the information from its data source.
Which template must you provide, in order to display data in a Repeater
control?
ItemTemplate.
49. How can you provide an alternating color scheme in a Repeater control?
Use the AlternatingItemTemplate.
50. What property must you set, and what method must you call in your code,
in order to bind the data from a data source to the Repeater control?
You must set the DataSource property and call the DataBind method.
51. What base class do all Web Forms inherit from?
The Page class.
52. Name two properties common in every validation control?
ControlToValidate property and Text property.
53. Which property on a Combo Box do you set with a column name, prior to
setting the DataSource, to display data in the combo
box?
DataTextField property.
54. Which control would you use if you needed to make sure the values in two
different controls matched?
CompareValidator control.
How many classes can a single .NET DLL contain?
It can contain many classes.
55. What is ViewState?
ViewState allows the state of objects (serializable) to be stored in a hidden field on the
page. ViewState is transported to the client
and back to the server, and is not stored on the server or any other external
source. ViewState is used the
retain the state of server-side objects between postabacks.
56. What is the lifespan for items stored in ViewState?
Item stored in ViewState exist for the
life of the current page. This includes postbacks
(to the same page).
57. What does the "EnableViewState"
property do? Why would I want it on or off?
It allows the page to save the users input on a form across postbacks. It saves the server-side values for a
given control into ViewState, which is stored as a
hidden value on the page before sending the page to the clients
browser. When the page is posted back to the server the server control is
recreated with the state stored in viewstate.
58. What are the different types of Session state management options
available with ASP.NET?
ASP.NET provides In-Process and Out-of-Process state
management. In-Process stores the session in memory on the web
server. This requires the a
"sticky-server" (or no load-balancing) so that the user is always
reconnected to the same web server. Out-of-Process Session state
management stores data in an external data source. The external data
source may be either a SQL Server or a State Server service.
Out-of-Process state management requires that all objects stored in session are
serializable.
59. What are the Application_Start
and Session_Start subroutines used for?
This is where you can set the specific variables for the Application and
Session objects.
Can you explain what inheritance is and an example of when you might use it?
When you want to inherit (use the functionality of)
another class. Example: With a base class named Employee, a Manager
class could be derived from the Employee base class.
Whats an assembly?
Assemblies are the building blocks of the .NET framework.
Describe the difference between inline and code behind.
Inline code written along side the html in a page.
Code-behind is code written in a separate file and referenced by the .aspx
page.
Explain what a diffgram is,
and a good use for one?
The DiffGram is one of the two XML formats that
you can use to render DataSet object contents to XML.
A good use is reading database data to an XML file to be sent to a Web Service.
Whats MSIL, and
why should my developers need an appreciation of it if at all?
MSIL is the Microsoft Intermediate Language. All .NET compatible languages
will get converted to MSIL. MSIL also allows the .NET Framework to JIT compile the assembly on the installed computer.
Which method do you invoke on the DataAdapter
control to load your generated dataset with data?
The Fill() method.
Can you edit data in the Repeater control?
No, it just reads the information from its data source.
Which template must you provide, in order to display data in a Repeater
control?
ItemTemplate.
How can you provide an alternating color scheme in a Repeater control?
Use the AlternatingItemTemplate.
What property must you set, and what method must you call in your code, in
order to bind the data from a data source to the Repeater control?
You must set the DataSource property and call the
DataBind method.
What base class do all Web Forms inherit from?
The Page class.
Name two properties common in every validation control?
ControlToValidate property and Text property.
Which property on a Combo Box do you set with a column name, prior to
setting the DataSource, to display data in the combo
box?
DataTextField property.
Which control would you use if you needed to make sure the values in two
different controls matched?
CompareValidator control.
How many classes can a single .NET DLL contain?
It can contain many classes.
Describe the role of inetinfo.exe,
aspnet_isapi.dll andaspnet_wp.exe in the page loading process.
inetinfo.exe is theMicrosoft
IIS server running, handling ASP.NET requests among other things.When
an ASP.NET request is received (usually a file with .aspx extension), the ISAPI
filter aspnet_isapi.dll takes care of it by passing the request tothe actual worker process aspnet_wp.exe.
What’s the difference between Response.Write() andResponse.Output.Write()?
Response.Output.Write() allows you to write formatted output.
What methods are fired during the page load?
Init() - when the page is instantiated
Load() - when the page is loaded into server memory
PreRender() - the brief moment before the page is
displayed to the user as HTML
Unload() - when page finishes loading.
When during the page processing cycle is ViewState
available?
After the Init() and before the Page_Load(),
or OnLoad() for a control.
What namespace does the Web page belong in the .NET Framework class
hierarchy?
System.Web.UI.Page
Where do you store the information about the
user’s locale?
System.Web.UI.Page.Culture
What’s the difference between Codebehind="MyCode.aspx.cs"
andSrc="MyCode.aspx.cs"?
CodeBehind is relevant to Visual Studio.NET only.
What’s a bubbled event?
When you have a complex control, like DataGrid, writing an event processing
routine for each object (cell, button, row, etc.) is quite tedious. The
controls can bubble up their eventhandlers, allowing
the main DataGrid event handler to take care of its constituents.
Suppose you want a certain ASP.NET function executed on MouseOver
for a certain button. Where do you add an event handler?
Add an OnMouseOver attribute to the button. Example: btnSubmit.Attributes.Add("onmouseover","someClientCodeHere();");
What data types do the RangeValidator control
support?
Integer, String, and Date.
Explain the differences between Server-side and Client-side code?
Server-side code executes on the server. Client-side code executes in the
client's browser
What type of code (server or client) is
found in a Code-Behind class?
The answer is server-side code since code-behind is executed on the server. However,
during the code-behind's execution on the server, it can render client-side
code such as JavaScript to be processed in the clients
browser. But just to be clear, code-behind executes on the server, thus making
it server-side code.
Should user input data validation occur server-side or client-side? Why?
All user input data validation should occur on the server at a minimum.
Additionally, client-side validation can be performed where deemed appropriate
and feasable to provide a richer, more responsive experience
for the user.
What is the difference between Server.Transfer and
Response.Redirect? Why would I choose one over the
other?
Server.Transfer transfers page processing from one
page directly to the next page without making a round-trip back to the client's
browser. This provides a faster response with a little less overhead on the
server. Server.Transfer does not update the clients url history list or current url. Response.Redirect is used to
redirect the user's browser to another page or site. This performas a trip back to the client where the client's
browser is redirected to the new page. The user's browser history list
is updated to reflect the new address.
Can you explain the difference between an ADO.NET Dataset and an
Valid answers are:
· A DataSet can represent an entire relational
database in memory, complete with tables, relations, and views.
· A DataSet is designed to work without any
continuing connection to the original data source.
· Data in a DataSet is bulk-loaded, rather than being
loaded on demand.
· There's no concept of cursor types in a DataSet.
· DataSets have no current record baller
You can use For Each loops to move through the data.
· You can store many edits in a DataSet, and write
them to the original data source in a single operation.
· Though the DataSet is universal, other objects in
ADO.NET come in different versions for different data sources.
What is the Global.asax used for?
The Global.asax (including the Global.asax.cs
file) is used to implement application and session level events.