|
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.
|
| |
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.csYou 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.
|
| |
| What are private assemblies and shared assemblies? |
A private assembly is used only by a single application, and is stored in that application's install directory (or a
subdirectory therein). A shared assembly is one that can be referenced by more than one application. In order to
share an assembly, the assembly must be explicitly built for this purpose by giving it a cryptographically strong
name (referred to as a strong name). By contrast, a private assembly name need only be unique within the
application that uses it.
By making a distinction between private and shared assemblies, we introduce the notion of sharing as an explicit
decision. Simply by deploying private assemblies to an application directory, you can guarantee that that
application will run only with the bits it was built and deployed with. References to private assemblies will only
be resolved locally to the private application directory.
There are several reasons you may elect to build and use shared assemblies, such as the ability to express
version policy. The fact that shared assemblies have a cryptographically strong name means that only the author
of the assembly has the key to produce a new version of that assembly. Thus, if you make a policy statement
that says you want to accept a new version of an assembly, you can have some confidence that version updates
will be controlled and verified by the author. Otherwise, you don't have to accept them.
For locally installed applications, a shared assembly is typically explicitly installed into the global assembly
cache (a local cache of assemblies maintained by the .NET Framework). Key to the version management
features of the .NET Framework is that downloaded code does not affect the execution of locally installed
applications. Downloaded code is put in a special download cache and is not globally available on the machine
even if some of the downloaded components are built as shared assemblies.The classes that ship with the .NET
Framework are all built as shared assemblies.
|
| |
| What is the difference between a namespace and an assembly name? |
A namespace is a logical naming scheme for types in which a simple type name, such as MyType, is preceded
with a dot-separated hierarchical name. Such a naming scheme is completely under the control of the developer.
For example, types MyCompany.FileAccess.A and MyCompany.FileAccess.B might be logically expected to
have functionality related to file access. The .NET Framework uses a hierarchical naming scheme for grouping
types into logical categories of related functionality, such as the Microsoft® ASP.NET application framework,
or remoting functionality. Design tools can make use of namespaces to make it easier for developers to browse
and reference types in their code. The concept of a namespace is not related to that of an assembly. A single
assembly may contain types whose hierarchical names have different namespace roots, and a logical namespace
root may span multiple assemblies. In the .NET Framework, a namespace is a logical design-time naming
convenience, whereas an assembly establishes the name scope for types at run time.
|
| |
| What is the difference between a private assembly and a shared assembly? |
The terms 'private' and 'shared' refer to how an assembly is deployed, not any intrinsic attributes of the
assembly.
A private assembly is normally used by a single application, and is stored in the application's directory, or a subdirectory
beneath. A shared assembly is intended to be used by multiple applications, and is normally stored in
the global assembly cache (GAC), which is a central repository for assemblies. (A shared assembly can also be
stored outside the GAC, in which case each application must be pointed to its location via a codebase entry in
the application's configuration file.) The main advantage of deploying assemblies to the GAC is that the GAC
can support multiple versions of the same assembly side-by-side.
Assemblies deployed to the GAC must be strong-named. Outside the GAC, strong-naming is optional.
|
| |
| |
|
| |