Технически, в DLL нет пространств имен.
На уровне CLR вообще нет пространств имен, только полные имена классов. Имя класса CLR может состоять из произвольно длинной последовательности любых символов Юникода - например, @#$%
будет отличным именем класса, что касается CLR.
Теперь по соглашению (CLS, быть конкретными), имена классов ограничены определенными Unicode символами (буквенно-цифровых символов и _
, и куча других экзотических Unicode категорий - см спецификации для получения дополнительной информации) и точкой, и точка используется для обозначения пространств имен. Это чисто соглашение между компиляторами (и другими инструментами).
Таким образом, всякий раз, когда сборка ссылается на какой-либо тип по какой-либо причине, он просто использует свое полное имя CLR, например System.String
. Но есть больше - на самом деле, он использует полное имя, которое также включает сборку.Вы можете увидеть их, если посмотрите на вывод ildasm
- они выглядят примерно как [mscorlib]System.String
, поэтому среда выполнения знает, где искать.
Иными словами, CLR действительно видит сборку mscorlib.dll, имеющую класс System.String
, и сборку B.exe, ссылающуюся на этот класс как [mscorlib]System.String
. Ваш оператор using
не генерирует никакого кода в выходной DLL/EXE самостоятельно; это просто так, что вам не нужно писать System.String
все время.
Это работа компилятора перевести свой код, говорящий String
, в области видимости using System;
заявления, в проекте, который ссылается mscorlib.dll
, к [mscorlib]System.String
. Все это делается во время компиляции. Единственное, что CLR делает во время выполнения, - это разрешить mscorlib
, чтобы найти фактическую mscorlib.dll на диске (а другой ответ объясняет, как именно это происходит).
Это звучит интересно, но когда я запустил «Инструменты Windows SDK> Fusion log viewer», каждая кнопка отключается в этом окне. В диалоговом окне настроек все отключено. – claws
Если вы используете Vista или Windows 7 с включенным UAC, вы должны запустить его из командной строки с повышенными правами, потому что для изменения настроек регистрации фьюжн необходимы административные привилегии. – Josh
«Правило большого пальца, однако, должно сначала попробовать глобальный кэш сборок, а затем проверить локальный каталог вместе с кучей других альтернативных путей». Скажем, если я установил «.NET MYSQL CONNECTOR» (используя MySql.Data). Используя ссылки во время компиляции, он обнаруживает DLL, но его путь будет чем-то вроде c: \ programfiles \ mysql \ .net \ mysql.dll, но после того, как приложение будет построено, а какое-то другое его использует. все мое приложение знает, что это его mysql.dll, но на usermachine это.сетевой разъем может быть установлен на d: \ apps \ somecrap \ mysql.dll. Тогда как обнаружить clr? – claws