梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
D Y N A M I C L O AD I N G
What is useful with convention architecture is that you are not limited to what is defined
in the configuration file�察�as there is a general logic。 When implementing a convention architec
ture�察�you are not discarding configuration�察�but you are making assumptions for the user and
implementation of the code。 You will still probably have a configuration file�察�but the configuration
is for specific functionality。
Regardless of whether you use a configuration architecture or a convention architecture�察 �
you will dynamically load assemblies�察�as demonstrated in this chapter。
Setting Up the Dynamic Loading Projects
For this chapter¨s examples�察�four projects are defined�此�
o Definitions�此�A class library that contains the definition for the interface IDefinition and
the class ConfigurationLoader。 The class ConfigurationLoader will contain the functionality
to dynamically load the assemblies Implementations1 and Implementations2。
o Implementations1�此�A class library that contains the class Implementation and implements
the interface IDefinition。 The class Implementation is defined in the namespace
Implementations1 and is not declared Public。
o Implementations2�此�A class library that contains the class Implementation and imple
ments the interface IDefinition。 The class Implementation is defined in the namespace
Implementations2 and is not declared Public。
o CallRuntimeImplementation�此�A console application that will be referenced throughout
the chapter as the user application。
In the Definitions project�察�the references are to the standard libraries �─�System�察 �
System。Core�察�and so on��。 The unique reference that you need to add is to System。configuration。
The System。configuration reference contains the types that you need to read the application
configuration file。
Here is the code for IDefinition�此�
Public Interface IDefinition
Function TranslateWord��ByVal word As String�� As String
End Interface
The Implementations1 project contains the file Implementation。vb�察�which is the type
Implementation and implements the interface IDefinitions。 The implementation of
Implementation is as follows ��make sure you add a reference to the Definitions project���此�
Imports Definitions
Class Implementation �此�Implements IDefinition
Public Function TranslateWord��ByVal word As String�� _
As String Implements IDefinition。TranslateWord
Return ;;
End Function
End Class
´´´´´´´´´´´´´´´´´´´´´´Page 339´´´´´´´´´´´´´´´´´´´´´´´
CH AP T E R 1 2 * L E AR N IN G AB O U T AP P L I CAT I ON CO N F IG U R AT IO N A N D D Y N A M IC L O AD IN G 317
The class Implementation has a hard reference to IDefinition�察�so under the References
node in the Implementations1 project is a reference to the Definitions project。 Because there
is a hard reference to IDefinition�察�the interface IDefinition is declared as Public�察�but
Implementation is not。
The Implementations2 project has the same implementation and reference to Definitions
as Implementations1。 What is special about Implementations2 is its use of a strong name�察�which
makes it unique。 Thus far�察�all of your assemblies are not unique。 To make them unique�察�you
need to enable signing。 You must also enable signing in the Definitions project。 The next
section describes how to enable signing。
The CallRuntimeImplementation project is the user application and is responsible for calling
the functionality in Implementations1 and Implementations2。 What you need to consider very
carefully in the CallRuntimeImplementation project structure is that in the References node�察 �
only the Definitions project is present。 It does not contain references to Implementations1 or
Implementations2。
It is important to understand that when a project does not have a reference to another
project�察�it does not imply that the functionality cannot be used。 To use the functionality of a
project that is not referenced�察�you need to write code that will load the assembly dynamically。
With a dynamically loaded assembly�察�you can do whatever is possible with a hard´linked reference。
*Note Remember that assemblies are the results of piling a project。 A code library will produce a DLL
file�察�while an executable project will produce an EXE file。
Signing an Assembly
Signing an assembly is giving the assembly a strong name�察�which is a unique name。 Think of it
as follows。 My name is Christian Gross�察�and on this planet we call Earth�察�there are probably a
few dozen people with the name Christian Gross。 Our governments distinguish between the
various people with my name by way of a passport。 A passport is a unique identifier that converts
my mon name into a strong name。 This is exactly what happens when you use strong names
with an assembly。 A strong name is required when you want to add the assembly to the global
assembly cache ��GAC��。 The GAC is where you can place an assembly to make it available for
global shared access。 You¨ll learn more about the GAC in the ^Loading a Strongly Named
Assembly ̄ section later in this chapter。
By default�察�signing is not used。 To enable signing�察�you need to alter the properties of
the project。 Follow these steps to enable signing for the Implementations2 project and the
Definitions project�此 �
1。 Right´click the project in the Solution Explorer and select Properties。
2。 Click the Signing tab。
3。 Check the Sign the Assembly check box。
4。 Select from the bo box�察�which pops up a dialog box allowing you to specify
the file name。
´´´´´´´´´´´´´´´´´´´´´´Page 340´´´´´´´´´´´´´´´´´´´´´´´
318 CH AP T E R 1 2 * L E A R N I N G A B OU T A PP L I CA TI O N CO N F I G U R AT IO N AN D D Y N A M I C L O AD I N G
5。 Type in a key file name and a password�察�and then click OK。
6。 Save your project。
Setting the Output Path
The aim of the chapter is to demonstrate two things�此�configuration files and the dynamic abil
ities of 。 Explaining�察�debugging�察�and running the configuration source code is simple�察�because
everything is laid out for you in the Visual Basic IDE。 You will not run into any problems running
the configuration code。 However�察�for the dynamic loading�察�there is a plication。
As you¨ve seen�察�the CallRuntimeImplementation project does not have explicit references
to Implementations1 and Implementations2。 This means that if the code from Implementations1
or Implementations2 is referenced from CallRuntimeImplementations using dynamic techniques�察 �
Visual Basic Express will have no clue as to what you are doing。 You might argue that there is
one Visual Basic Express solution�察�and Implementations1 and Implementations2 are part of the
overall project�察�but unless an explicit reference is made�察�Visual Basic Express does not know
about this。
However�察�you can overe this problem fairly easily by changing where the projects
place their piled output。 As a habit�察�I often make all projects build to a central directory。
You can set the output directory in the pile tab of a project¨s Properties w