Popular Posts

Saturday, 17 August 2013

interview questions_1.Basic .NET Framework

Hello guys....
Lets now focus on topic wise some important interview and conceptual question on asp.net as well as sql server.
1.   Basic .NET Framework

1.1)What is a CLR? Full form of CLR is Common Language Runtime and it forms the heart of the .NET framework. All Languages have runtime and its the responsibility of the runtime to take care of the code execution of the program. For example VC++ has MSCRT40.DLL,VB6 has MSVBVM60.DLL, Java has Java Virtual Machine etc. Similarly .NET has CLR.
 Following are the responsibilities of CLR
√ Garbage Collection :- CLR automatically manages memory thus eliminating memory leaks. When objects are not referred GC automatically releases those memories thus providing efficient memory management.
√ Code Access Security :- CAS grants rights to program depending on the security configuration of the machine. Example the program has rights to edit or create a new file but the security configuration of machine does not allow the program to delete a file. CAS will take care that the code runs under the environment of machines security configuration.
√ Code Verification :- This ensures proper code execution and type safety while the code runs. It prevents the source code to perform illegal operation such as accessing invalid memory locations etc.
√ IL( Intermediate language )-to-native translators and optimizer’s :- CLR uses JIT and compiles the IL code to machine code and then executes. CLR also determines depending on platform what is optimized way of running the IL code.

1.2)      What is a CTS?
 In order that two language communicate smoothly CLR has CTS (Common Type System).Example in VB you have “Integer” and in C++ you have “long” these datatypes are not compatible so the interfacing between them is very complicated. In order to able that two different languages can  communicate Microsoft introduced Common Type System. So “Integer” datatype in VB6 and “int” datatype in C++ will convert it to System.int32 which is datatype of CTS.


1.3) What is a Assembly?
Assembly is unit of deployment like EXE or a DLL.
 √ An assembly consists of one or more files (dlls, exe’s, 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 assembly is completely self-describing.An assembly contains metadata information, which is used by the CLR for everything from type checking and security to actually invoking the components methods. As all information is in the assembly itself, it is independent of registry. This is the basic advantage as compared to COM where the version was stored in registry.
 √ Multiple versions can be deployed side by side in different folders. These different versions can execute at the same time without interfering with each other. Assemblies can be private or shared. For private assembly deployment, the assembly is copied to the same directory as the client program that references it. No registration is needed, and no fancy installation program is required.
----------------------------------------------------------------------------------------------------------------------


1.4) What is NameSpace?
 Namespace has two basic functionality :-
√ NameSpace Logically group types, example System.Web.UI logically groups our UI related features.
 √ In Object Oriented world many times its possible that programmers will use the same class name.By qualifying NameSpace with classname this collision is able to be removed.
Assembly is physical grouping of logical units. Namespace logically groups classes.
√ Namespace can span multiple assembly.

------------------------------------------------------------------------------------------------------------------------
1.5) If you want to view a Assembly how do you go about it ?
Twist : What is ILDASM ?
When it comes to understanding of internals nothing can beat ILDASM. ILDASM basically converts the whole exe or dll in to IL code.
To run ILDASM you have to go to "C:\Program Files\Microsoft101 Visual Studio .NET 2003\SDK\v4.0\Bin".
Note that i had v4.0 you have to probably change it depending on the type of framework version you have. If you run IDASM.EXE from the path you will be popped with the IDASM exe program as shown in figure ILDASM. Click on file and browse to the respective directory for the DLL whose assembly you want to view. After you select the DLL you will be popped with a tree view details of the DLL as shown in figure ILDASM. On double clicking on manifest you will be able to view details of assembly, internal IL code etc as shown in Figure Manifest View. Note : The version number are in the manifest itself which is defined with the DLL or EXE thus making deployment much easier as compared to COM where the information was stored in registry. Note the version information in Figure Manifest view.
 ------------------------------------------------------------------------------------------------------------------------------------------------

1.6) What is GAC ?
Twist :- What are situations when you register .NET assembly in GAC ?
 GAC (Global Assembly Cache) is used where shared .NET assembly reside. GAC is used in the following situations :-
 √ If the application has to be shared among several application.
 √ If the assembly has some special security requirements like only administrators can remove the assembly. If the assembly is private then a simple delete of assembly the assembly file will remove the assembly.
Note :- Registering .NET assembly in GAC can lead to the old problem of DLL hell, where COM version was stored in central registry. So GAC should be used when absolutely necessary.

---------------------------------------------------------------------------------------------------------------------------------------------
1.7) What is the concept of strong names ?
Twist :- How do we generate strong names or what is the process of generating strong names, What is use the of SN.EXE , How do we apply strong names to assembly, How do you sign an assembly?
Strong name is similar to GUID(It is supposed to be unique in space and time) in COM components.Strong Name is only needed when we need to deploy assembly in GAC. Strong Names helps GAC to differentiate between two versions. Strong names use public key cryptography (PKC) to ensure that no one can spoof it.PKC use public key and private key concept. Following are the step to generate a strong name and sign a assembly :-
Go to “Visual Studio Command Prompt”. See below figure “Visual studio Command Prompt”. Note the samples are compiled in 2005 but 2003 users do not have to worry about it. Same type of command prompt will be seen in 2003 also.
After you are in command prompt type sn.exe -k “c:\test.snk”.
 After generation of the file you can view the SNK file in a simple notepad.
√ After the SNK file is generated its time to sign the project with this SNK file.
Click on project -- properties and the browse the SNK file to the respective folder and compile the project.

(I)How to add and remove an assembly from GAC? There are two ways to install .NET assembly in GAC:-
√ Using Microsoft Installer Package. You can get download of installer from http://www.microsoft.com.
 √ Using Gacutil. Goto “Visual Studio Command Prompt” and type “gacutil –i (assembly_name)”, where (assembly_name) is the DLL name of the project.

---------------------------------------------------------------------------------------------------------------------- 

1.8) What is garbage collection?
Garbage collection is a CLR feature which automatically manages memory. Programmers forget to release the objects while coding ..... Laziness (Remember in VB6 where one of the good practices is to set object to nothing). CLR automatically releases objects when they are no longer in use and refernced. CLR runs on non-deterministic to see the unused objects and cleans them. One side effect of this non-deterministic feature is that we cannot assume an object is destroyed when it goes out of the scope of a function. Therefore, we should not put code into a class destructor to release resources.
 (I) Can we force garbage collector to run ? System.GC.Collect() forces garbage collector to run. This is not recommended but can be used if situations arises.
------------------------------------------------------------------------------------------------------------------------

1.9)What is reflection? !!!IMPORTANT!!!!
 All .NET assemblies have metadata information stored about the types defined in modules. This metadata information can be accessed by mechanism called as “Reflection”.System. Reflection can be used to browse through the metadata information. Using reflection you can also dynamically invoke methods using System.Type.Invokemember.
This example shows how a string literal is used to find a variable with that same name.
Program that uses reflection: C#
 
using System;
using System.Reflection;
 
class Program
{
    public static int _number = 7;
    static void Main()
    {
        Type type = typeof(Program);
        FieldInfo field = type.GetField("_number");
        object temp = field.GetValue(null);
        Console.WriteLine(temp);
    }
}
 
Output
7
Some useful applications:
·         Determing dependancies of an assembly
·         Location types which conform to an interface, derive from a base / abstract class, and searching for members by attributes
·         (Smelly) testing - If you depend on a class which is untestable (ie it doesn't allow you to easily build a fake) you can use Reflection to inject fake values within the class--it's not pretty, and not recommended, but it can be a handy tool in a bind.
·         Debugging - dumping out a list of the loaded assemblies, their references, current methods, etc...
Reflection allows an application to collect information about itself and also to manipulate on itself. It can be used to find all types in an assembly and/or dynamically invoke methods in an assembly.
System.Reflection: namespace contains the classes and interfaces that provide a managed view of loaded types, methods, and fields, with the ability to dynamically create and invoke types; this process is known as Reflection in .NET framework.
System.Type: class is the main class for the .NET Reflection functionality and is the primary way to access metadata. The System.Type class is an abstract class and represents a type in the Common Type System (CLS).
It represents type declarations: class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types.
ANOTHER EXAMPLE::
using System;
using System.Reflection;

static class ReflectionTest
{
    public static int Height;
    public static int Width;
    public static int Weight;
    public static string Name;

    public static void Write()
    {
    Type type = typeof(ReflectionTest); // Get type pointer
    FieldInfo[] fields = type.GetFields(); // Obtain all fields
    foreach (var field in fields) // Loop through fields
    {
        string name = field.Name; // Get string name
        object temp = field.GetValue(null); // Get value
        if (temp is int) // See if it is an integer.
        {
        int value = (int)temp;
        Console.Write(name);
        Console.Write(" (int) = ");
        Console.WriteLine(value);
        }
        else if (temp is string) // See if it is a string.
        {
        string value = temp as string;
        Console.Write(name);
        Console.Write(" (string) = ");
        Console.WriteLine(value);
        }
    }
    }
}

class Program
{
    static void Main()
    {
    ReflectionTest.Height = 100; // Set value
    ReflectionTest.Width = 50; // Set value
    ReflectionTest.Weight = 300; // Set value
    ReflectionTest.Name = "ShekharShete"; // Set value
    ReflectionTest.Write(); // Invoke reflection methods
    }
}

Output

Height (int) = 100
Width (int) = 50
Weight (int) = 300
Name (string) = ShekharShete



----------------------------------------------------------------------------------------------- 
1.10)What are Value types and Reference types ?
Value types directly contain their data which are either allocated on the stack or allocated in-line in a structure. Reference types store a reference to the value's memory address, and are allocated on the heap.
Reference types can be self-describing types, pointer types, or interface types. Variables that are value types each have their own copy of the data, and therefore operations on one variable do not affect other variables.
 Variables that are reference types can refer to the same object; therefore, operations on one variable can affect the same object referred to by another variable.
 All types derive from the System.Object base type.
--------------------------------------------------------------------------------------------------------------------

1.11) What is concept of Boxing and Unboxing ?
Boxing permits any value type to be implicitly converted to type object or to any interface type implemented by value type. Boxing is a process in which object instances are created and copy values in to that instance. Unboxing is vice versa of boxing operation where the value is copied from the instance in to appropriate storage location.
Below is sample code of boxing and unboxing where integer data type is converted in to object and then vice versa.


IN VB.NET..............
Dim x As Integer
 Dim y As Object x = 10
‘ boxing process
y = x 
 unboxing process
 x = y


IN C#...............
int x=0;
object y=null;
x=10;
//boxing process
y=x;
//unboxing process
x=y;

 -----------------------------------------------------------------------------------------------------------------

1.12) What is the difference between VB.NET and C# ?
Well this is the most debatable issue in .NET community and people treat there languages like religion. Its a subjective matter which language is best. Some like VB.NET’s natural style and some like professional and terse C# syntaxes. Both use the same framework and speed is also very much equivalents. But still let’s list down some major differences between them :- Advantages VB.NET :-
 √ Has support for optional parameters which makes COM interoperability much easy.
 √ With Option Strict off late binding is supported.Legacy VB functionalities can be used by using Microsoft.VisualBasic namespace.
√ Has the WITH construct which is not in C#.
√ The VB.NET part of Visual Studio .NET compiles your code in the background. While this is considered an advantage for small projects, people creating very large projects have found that the IDE slows down considerably as the project gets larger.

Advantages of C#
XML documentation is generated from source code but this is now been incorporated in Whidbey.
 √ Operator overloading which is not in current VB.NET but is been introduced in Whidbey.
√ Use of this statement makes unmanaged resource disposal simple.
√ Access to Unsafe code. This allows pointer arithmetic etc, and can improve performance in some situations. However, it is not to be used lightly, as a lot of the normal safety of C# is lost (as the name implies).This is the major difference that you can access unmanaged code in C# and not in VB.NET
------------------------------------------------------------------------------------------------------------------- 

1.13)What is the difference between System exceptions and Application exceptions?
All exception derives from Exception Base class. Exceptions can be generated programmatically or can be generated by system. Application Exception serves as the base class for all application-specific exception classes. It derives from Exception but does not provide any extended functionality. You should derive your custom application exceptions from Application Exception. Application exception is used when we want to define user defined exception, while system exception is all which is defined by .NET.

(I)What is CODE Access security? CAS is part of .NET security model that determines whether or not a piece of code is allowed to run and what resources it can use while running. Example CAS will allow an application to read but not to write and delete a file or a resource from a folder.
(II) How to prevent my .NET DLL to be decompiled?
 By design .NET embeds rich Meta data inside the executable code using MSIL. Any one can easily decompile your DLL back using tools like ILDASM (owned by Microsoft) or Reflector for .NET which is a third party. Secondly there are many third party tools which make this decompiling process a click away. So any one can easily look in to your assemblies and reverse engineer them back in to actual source code and understand some real good logic which can make it easy to crack your application. The process by which you can stop this reverse engineering is using “obfuscation”. It’s a technique which will foil the decompilers. There are many third parties (XenoCode, Demeanor for .NET) which provide .NET obfuscation solution. Microsoft includes one that is Dotfuscator Community Edition with Visual Studio.NET.

TO READ MORE ABOUT obfuscation PLEASE READ MY OTHER ARTICLE SPECIALLY ON THIS.i.e ........LETS KNOW ABOUT “OBFUSCATION”.

 ---------------------------------------------------------------------------------------------

1.14) What is the difference between Convert.toString and .toString() method ?
 Just to give an understanding of what the above question means seethe below code.
int i =0;
 MessageBox.Show(i.ToString());
 MessageBox.Show(Convert.ToString(i));
 We can convert the integer “i” using “i.ToString()” or “Convert.ToString” so what’s the difference. The basic difference between them is “Convert” function handles NULLS while “i.ToString()” does not it will throw a NULL reference exception error. So as good coding practice using “convert” is always safe.
---------------------------------------------------------------------------------------------------- 

1.15) What is Native Image Generator (Ngen.exe)?
The Native Image Generator utility (Ngen.exe) allows you to run the JIT compiler on your assembly's MSIL and generate native machine code which is cached to disk. After the image is created .NET runtime will use the image to run the code rather than from the hard disk. Running Ngen.exe on an assembly potentially allows the assembly to load and execute faster, because it restores code and data structures from the native image cache rather than generating them dynamically.
 Below are some points to be remembered for Native Image Generator:-
√ Native images load faster than MSIL because JIT compilation and type-safety verification is eliminated.
√ If you are sharing code between process Ngen.exe improves the performance significantly. As Native image generated Windows PE file so a single DLL file can be shared across applications. By contrast JIT produced code are private to an assembly and can not be shared.
 √ Native images enable code sharing between processes.
√ Native images require more storage space and more time to generate.
√ Startup time performance improves lot. We can get considerable gains when applications share component assemblies because after the first application has been started the shared components are already loaded for subsequent applications. If assemblies in an application must be loaded from the hard disk, does not benefit as much from native images because the hard disk access time shadows everything.
√ Assemblies in GAC do not benefit from Native image generator as the loader performs extra validation on the strong named assemblies thus shadowing the benefits of Native Image Generator.
√ If any of the assemblies change then Native image should also be updated. √ You should have administrative privilege for running Ngen.exe.
√ While this can fasten your application startup times as the code is statically compiled but it can be somewhat slower than the code generated dynamically by the JIT compiler. So you need to compare how the whole application performance with Ngen.exe and with out it.

To run Ngen.exe, use the following command line.
 ngen.exe install <assemblyname>
 This will synchronously precompile the specified assembly and all of its dependencies.
The generated native images are stored in the native image cache. In .NET Framework 2.0 there is a service (.NET Runtime Optimization Service) which can precompile managed assemblies in the background. You can schedule your assemblies to be precompiled asynchronously by queueing them up with the NGEN Service.
 Use the following command line. ngen.exe install <assemblyname> /queue:<priority> Assemblies which are critical to your application's start up time should either be precompiled synchronously or asynchronously with priority 1. Priority 1 and 2 assemblies are precompiled aggressively while Priority 3 assemblies are only precompiled during machine idle-time. Synchronously precompiling your critical assemblies guarantees that the native images will be available prior to the first time your end user launches the application but increases the time taken to run your application's set up program.

 You can uninstall an assembly and its dependencies (if no other assemblies are dependent on them) from the native image cache by running the following command. ngen.exe uninstall <assemblyname> Native images created using Ngen.exe cannot be deployed; instead they need to be created on the end user's machine. These commands therefore need to be issued as part of the application's setup program. Visual Studio .NET can be used to implement this behavior by defining custom actions in a Microsoft Installer (MSI) package.
Note: - One of the things the interviewer will expect to be answered is what scenario will use a Native Image generator. Best is to say that we first need to test the application performance with Native Image and with out it and then make a decision.


1.16) We have two version of the same assembly in GAC? I want my client to make choice of which assembly to choose?
Note: - I really want to explain this in depth for two reasons. First I have seen this question been frequently asked and second it’s of real practical importance. I have faced this in every of my .NET projects...So let’s try to get this fundamental not in our brain but in our heart.
OK first let’s try to understand what the interviewer is talking about. Let’s say you have made an application and its using a DLL which is present in GAC. Now for some reason you make second version of the same DLL and put it in GAC. Now which DLL does the application refer? Ok by default it always refers the latest one. But you want that it should actually use the older version.
 So first we answer in short.
 You need to specify “bindingRedirect” in your config file.
For instance in the below case “ClassLibraryVersion” has two versions “1.1.1830.10493” and “1.0.1830.10461” from which “1.1.1830.10493” is the recent version. But using the bindingRedirect we can specify saying “1.0.1830.10461” is the new version. So the client will not use “1.1.1830.10493”.
<configuration>
 <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly> <assemblyIdentity name="ClassLibraryVersion" publicKeyToken="b035c4774706cc72" culture="neutral"/>
 <bindingRedirect oldVersion= "1.1.1830.10493" newVersion= "1.0.1830.10461"/> </dependentAssembly>
</assemblyBinding>
</runtime>
 </configuration>

Ok now I will try to answer it in long way by doing a small sample project. Again this project will be done using C#.  Below is the solution display, it has two projects one the windows client project ( “WindowsVersioningCSharp” ) and second the class library project ( “ClassLibraryVersion” ) which will be installed in GAC with two versions.

A) Our first primary goal is to put two different versions of the same DLL in GAC.
So let’s make a walk through of “ClassLibraryVersion” project. It’s a very simple class which has “Version” function which just sends a string “This is old Version”. Second we will also just ensure that the assembly version is “1.0” in the “AssemblyInfo.cs”.

 B)Second in order that we can put a DLL in GAC we need to create generate strong names and assign the same to the class.
 Finally we need to install the same in GAC using “gacutil” tool.
 This installs one version of “ClassLibraryVersion.dll” in GAC.
 Now it is time to create a second version of the DLL. So here is what we will do first we will just return a different string value for this new version DLL.
 Secondly we also need to change the AssemblyVersion to “1.1.*” in the “AssemblyInfo.cs” file. After that again compile the DLL and run the “gacutil” to register this second version of the “ClasLibraryVersion.dll”.121
 Now when we view the GAC we can see two version of “ClassLibraryVersion” i.e. “1.1.1832.2619” and “1.0.1832.2172” (see figure below).
 Now that we have created the environment of two version of the same DLL in GAC its time to look at how client can make a choice between those versions. We need to generate “publicKeyToken” in order to move ahead.
 Now let’s look at the client which will consume this DLL. I have just added windows form and a button to the same. In the button click we will try to call the version function and display the data. So below is the code in the first step we create the object of “ClassLibraryVersion.Class1” and in the second step we call the “Version” function to display the data.
 Now comes the most important part of the whole thing the “app.config” file which will decide which version should be used. So add a new “app.config” file in the project and add the “AssemblyBinding” section as show below.
So you need to specify the following things:-
√ Assembly name in the “name” attribute of “assemblyIdentity” section.
√ Specify the “publicKeyToken” value in the “assemblyIndentity” section which was generated using “sn.exe –T ‘dllname.dll’ “.
 √ Specify the “oldVersion” and “newVersion” values in the “bindingRedirect” element. So what ever version we want the client to use should be specified in the “newVersion” attribute.123 You can see from the figure below I have specified that client should use “1.0.*” version. So the client will display “This is old Version”.
 If you run the source code with changing version numbers you can see the below two message boxes on different version numbers. That is “This is old version” will be displayed when “newVersion” value is “1.0.1832.5411” and “This is new Version” will be displayed when “newVersion” value is “1.1.1832.5427”.124

-------------------------------------------------------------------------------------------------------------------------------------------------------------- 
1.18)What is CodeDom?
 “CodeDom” is an object model which represents actually a source code. It is designed to be language independent - once you create a “CodeDom” hierarchy for a program we can then generate the source code in any .NET compliant language.
-----------------------------------------------------------------------------------------------------------------------------------So friends this is all for First topic  Basic .NET Framework
Tune IN TO GET ON OTHERS TOPICS
2.NET Interoperability
3.THREADING
4.Remoting and Webservices
5. OOPS(DID I DROP SOMETHING)....
ETC.......................................................................
THANKS FOR YOUR patience.........



No comments :

Post a Comment