Если вы создаете DLL с переключателем
/t:library,
то не сможете добавить ее к другой сборке. Дело в том, что компилятор автоматически генерирует декларацию для этой DLL, которая поэтому сама является сборкой. Чтобы увидеть это в действии, рассмотрим пример. У нас есть DLL (ModulelServer.cs), у которой есть фиктивный тип
Module!Server.
11
Module1Server.cs
// компоновка со следующими переключателями командной строки:
// esc /t:library Module1Server.cs
public class ModulelServer
{
}
Клиентский код в дальнейшем ссылается на эту DLL (Module 1-Client.cs):
// Module1ClientApp.cs
// компоновка со следующими переключателями командной строки:
// esc Module1ClientApp.cs /г:Module1Server.dll
using System;
using System.Diagnostics;
using System.Reflection;
class ModulelClientApp {
public static void Main() {
Assembly DLLAssembly = Assembly.6etAssembly(typeof (ModulelServer));
Console.WriteLine("Module1Server.dll Assembly Information");
Console.WriteLine("\t" + DLLAssembly);
Process p = Process.GetCurrentProcessO; string AssemblyName = p.ProcessName + ".exe"; Assembly ThisAssembly = Assembly.LoadFrom(AssemblyName); Console.WriteLine("Module1Client.exe Assembly Information"); Console.WriteLine("\t" + ThisAssembly); } }
А теперь допустим, что вы скомпоновали эти два модуля, используя переключатели:
esc /t:library ModulelServer.cs
esc ModulelClientApp.cs /r:Module1Server.dll
Если запустить программу, мы увидим информацию, доказывающую, что ЕХЕ и DLL существуют в своих собственных отдельных сборках:
Module1Server.dll Assembly Information
ModulelServer, Version=0.0.0.0, Culture=neutral,
PublicKeyToken=null Module1Client.dll Assembly Information
ModulelClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
На самом деле, если бы вы изменили модификатор доступа класса
ModulelServer
с
public
на
internal,
клиентский код перестал бы компилироваться, так как по определению модификатор доступа
internal
указывает, что модифицируемый тип доступен для другого кода только из той же сборки.