Здесь действительно происходит что-то тонкое в дополнение к комментариям других людей.
VisualStudio на самом деле не добавляет .dll ссылки на манифест сборки информации об отражении вашей сборки, если толькоони фактически используются.
В качестве примера создайте новый проект и создайте ссылку на сборку.Я использовал nunit.framework.dll
в качестве примера.
Но на самом деле не используйте его.Мой код просто:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
Но у Project есть ссылка на NUnit в VisualStudio.Теперь соберите его и откройте сборку в ildasm.exe
, а верхняя часть манифеста:
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly ConsoleApplication1
{
...etc...
Теперь в коде просто используйте что-нибудь из NUnit:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Assert.IsTrue(true);
}
}
}
Снова пересоберите и проверьте манифест сборки в ildasm.exe
:
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly extern nunit.framework
{
.publickeytoken = (96 D0 9A 1E B7 F4 4A 77 ) // ......Jw
.ver 2:6:0:12051
}
.assembly ConsoleApplication1
{
...etc...
Обратите внимание, что теперь в IL есть внешний.Это также обеспечивает отражение, поэтому оно знает, какие зависимые сборки должны быть загружены.
В прошлом эта небольшая деталь, как уже говорили другие, во время выполнения фактически не загружает сборку, пока она не понадобится в первый раз.следовательно, ваш домен приложений не имеет загруженных сборок до тех пор, пока вы не создадите экземпляр или не используете что-то из этой сборки.
Эта деталь выше вступает в силу, когда вы начинаете пытаться использовать метод Assembly.GetReferencedAssemblies()
.
Итак, в VisualStudio у меня есть проект со следующими ссылками:
Microsoft.CSharp
nunit.framework
System
System.Core
System.Data
System.Xml
System.Xml.Linq
Затем у меня есть код C #:
using System;
using System.Reflection;
using NUnit.Framework;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var assemblyName in assemblies)
{
Console.WriteLine(assemblyName.FullName);
}
Console.ReadKey();
}
}
}
Обратите внимание, что у меня даже есть using NUnit.Framework;
заявление!Но я на самом деле нигде не использую NUnit, поэтому не сборка, на которую ссылаются.Результат выполнения этого:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Вот и все.Если я добавлю эту строку в мое тестовое приложение:
Assert.IsTrue(true);
Теперь что-то на самом деле использует NUnit, и вывод моей консоли будет:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
nunit.framework, Version=2.6.0.12051, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77