2016-02-16 5 views
2

Локальные или глобальные (GAC/.NET) DLL-ссылки, насколько они дороги?Насколько дорого стоит ссылка на DLL?

Конечно, мы никогда не должны ссылаться на вещи, которые мы не используем, но для любопытства я спрашиваю: будет ли это большой проблемой производительности, связанной со всей платформой .NET?

Аналогичным более практичным вопросом было бы: стоит ли объединять подобные пространства имен в проектах, чтобы свести к минимуму файлы DLL, на которые нужно ссылаться (если в любом случае я должен использовать каждый код в этих DLL)?

+0

Если ваше приложение не является высокой производительности чувствительностью (т.е. вы рассчитываете микросекунд) или вы сильно ограничены памяти, то стоимость исполнения другой DLL будет довольно незначительный. Вам лучше организовать свои проекты логически, не беспокоясь о стоимости другой DLL. Только если тестирование показывает, что конкретные ссылки на DLL влияют на производительность, тогда рассмотрите адреса ссылок, которые, по словам профайлера, являются проблемой. –

+0

Хм, вы никогда не ссылаетесь ни на что из GAC. Вы вынуждаете компилятор читать метаданные каждой добавляемой ссылки. Файловый ввод-вывод - одна из самых дорогих вещей, которые должен выполнять компилятор, но на современной машине с SSD, которая, как правило, скрыта. Презрительный взгляд от членов вашей команды, безусловно, является более практичной проблемой. –

ответ

6

Ссылка загружается только при выполнении метода, который использует тип из ссылочной .dll. Поэтому, даже если вы ссылаетесь на всю платформу .NET, она не будет загружаться автоматически.

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad; 
     Console.WriteLine("=====Working with URI...====="); 
     WorkWithUri(); 

     Console.WriteLine("=====Working with XML...====="); 
     WorkWithXml(); 
    } 

    private static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args) 
    { 
     Console.WriteLine(args.LoadedAssembly.FullName + " has been loaded."); 
    } 

    private static void WorkWithUri() 
    { 
     var uri = new Uri("c:\\"); 
    } 

    private static void WorkWithXml() 
    { 
     XDocument xml = new XDocument(); 
    } 
} 

И выход:

=====Working with URI...===== 
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 has been loaded. 
=====Working with XML...===== 
System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 has been loaded. 
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 has been loaded. 
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 has been loaded. 
Press any key to continue . . .