Vamos exemplificar como um assembly pode ser composto por mais de um arquivo. Suponha que o arquivo Class1.cs contenha a definição da classe Class1, que implementa um método estático M qualquer. Você pode compilar Class1.cs passando a opção /target:module para o compilador, de modo a gerar um módulo .NET, isto é, uma unidade de código que foi compilada mas não é exatamente um assembly. O comando completo seria:
csc /target:module Class1.cs
Isso vai gerar o arquivo Class1.netmodule.
Suponha agora que o arquivo Class2.cs contém a definição da classe Class2, que implementa um método Main que faz chamadas ao método M de Class1. Você pode compilar Class2.cs passando a opção /addModule:Class1.netmodule, como mostra o comando completo abaixo:
csc /target:exe /addModule:Class1.netmodule Class2.cs
Isso irá gerar o assembly Class2.exe, que você já pode executar. Tente, agora, renomear o arquivo Class1.netmodule e depois executar novamente Class2.exe. A execução do assembly irá resultar no seguinte erro:
Exceção Não Tratada: System.IO.FileNotFoundException: Não foi encontrado nenhum nome de arquivo ou de conjunto de módulos (assembly) Class1.netmodule, nem nenhuma de suas dependências.
Nome do arquivo: "Class1.netmodule"
at ConsoleApplication1.Class2.Main(String[] a)
O assembly Class2.exe, portanto, não é totalmente autocontido, dependendo do módulo Class1.netmodule.
[]s
-- AFurtado