Because the MathUtil.dll
assembly is not digitally signed, a hacker could replace this assembly with one that contains malicious code, and the client of this assembly (which is the WindowsApp-Util application in this case) would not know that the assembly has been tampered with. Later in this chapter, you will see how to give the assembly a unique identity using a strong name.
An application using a library loads it only when necessary — the entire library is loaded into memory during runtime. If the library is large, your application uses up more memory and takes a longer time to load. To solve this problem, you can split an assembly into multiple modules and then compile each individually as a module. The modules can then be compiled into an assembly.
To see how you can use a module instead of an assembly, add a new Class Library project to the solution used in the previous section. Name the Class Library project StringUtil
. Populate the default Class1.cs
file as follows:
using System.Text.RegularExpressions;
namespace StringUtil {
public class Utils {
public bool ValidateEmail(string email) {
string strRegEx = @'^([a-zA-Z0-9_-.]+)@(([[0-9]{1,3}' +
@'.[0-9]{1,3}.[0-9]{1,3}.)|(([a-zA-Z0-9-]+' +
@'.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$';
Regex regex = new Regex(strRegEx);
if (regex.IsMatch(email)) return (true);
else return (false);
}
}
}
Instead of using Visual Studio 2008 to build the project into an assembly, use the C# compiler to manually compile it into a module.
To use the C# compiler, launch the Visual Studio 2008 Command Prompt (Start→Programs→Microsoft Visual Studio 2008→Visual Studio Tools→Visual Studio 2008 Command Prompt).
Navigate to the folder containing the StringUtil
project, and type in the following command to create a new module:
csc /target:module /out:StringUtil.netmodule Class1.cs
When the compilation is done, the StringUtil.netmodule
file is created (see Figure 15- 12).

Figure 15-12
Do the same for the MathUtil
class that you created earlier (see Figure 15-13):
csc /target:module /out:MathUtil.netmodule Class1.cs

Figure 15-13
Copy the two modules that you have just created — StringUtil.netmodule
and MathUtil.netmodule
— into a folder, say C:Modules. Now to combine these two modules into an assembly, type the following command:
csc /target:library /addmodule:StringUtil.netmodule /addmodule:MathUtil.netmodule /out:Utils.dll
This creates the Utils.dll
assembly (see Figure 15-14).

Figure 15-14
In the WindowsApp-Utils
project, remove the previous versions of the MathUtil.dll
assembly and add a reference to the Utils.dll
assembly that you just created (see Figure 15-15). You can do so via the Browse tab of the Add Reference dialog (navigate to the directory containing the modules and assembly, C:Modules). Click OK.

Figure 15-15
In the code-behind of Form1
, modify the following code as shown:
namespace WindowsApp_Util {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
}
}
}
The CallMathUtil()
function invokes the method defined in the MathUtil
module. The CallStringUtil()
function invokes the method defined in the StringUtil
module.
Set a break point in the Form1_Load
event handler, as shown in Figure 15-16, and press F5 to debug the application.

Figure 15-16
When the breakpoint is reached, view the Modules window (Debug→Windows→Modules), and note that the Utils.dll
assembly has not been loaded yet (see Figure 15-17).

Figure 15-17
Press F11 to step into the CallMathUtil()
function, and observe that the Utils.dll
assembly is now loaded, together with the MathUtil.netmodule
(see Figure 15-18).

Figure 15-18
Press F11 a few times to step out of the CallMathUtil()
function until you step into CallStringUtil()
. See that the StringUtil.netmodule
is now loaded (see Figure 15- 19).

Figure 15-19