其实是有一些微妙这里发生,除了别人的评论。
VisualStudio实际上确实不是添加.dll引用到您构建的程序集反射信息的程序集清单,除非它们被实际使用。
作为示例,创建一个新项目并引用程序集。我以nunit.framework.dll
为例。
但实际上并没有使用它。我的代码很简单:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
但该项目确实在VisualStudio中到NUnit的参考。现在建立它,并在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中有一个extern。这也提供反射,所以它知道什么依赖程序集将被加载。
像其他人所说的那样,细节没有实际加载程序集,直到它第一次被需要,因此你的AppDomain没有加载程序集,直到你实例化或使用某些东西部件。
当您开始尝试使用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
对不起,如果我的文章的意图不明确,但我试图表明,显示在VisualStudio中添加的参考是没有意义的。这对编译器来说更是如此,对实际放入程序集的内容影响甚微。 – CodingWithSpike 2012-03-30 18:21:33
+1对于一个清晰,彻底的答案:)我留给OP来学习这些事实;) – 2012-03-30 19:07:06
我希望每个人都可以给你像那样做的食堂......那里...... rally25years ... – Tarik 2012-04-01 15:58:19