获取程序集而不实例化它们

Tar*_*rik 4 .net c# vb.net assemblies

我试图让所有组件中CurrentDomain使用AppDomain.CurrentDomain.GetAssemblies()他们写FullNameDropDownList,但是如果我不实例化它们,它们不会在返回数组看到来自GetAssemblies()CurrentDomain.

它们都作为参考和Reference解决方案的文件夹添加.只有GetAssemblies()当我第一次实例化时,我才能从中获取它们.

如何以简单和更通用的方式克服这个问题,而不是每次添加新的程序集等时实例化它们.

由于公司政策,我必须模糊图像的某些部分:

在此输入图像描述

所有组件都在Reference文件夹中引用:

在此输入图像描述

Cod*_*ike 7

除了其他人的评论之外,这里发生了一些微妙的事情.

除非实际使用VisualStudio,否则 VisualStudio实际上不会将.dll引用添加到构建程序集的反射信息的程序集清单中.

作为示例,创建一个新项目,并引用一个程序集.我用它nunit.framework.dll作为一个例子.

但实际上并没有使用它.我的代码很简单:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但该项目确实在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...
Run Code Online (Sandbox Code Playgroud)

现在,在代码中,只使用NUnit中的任何内容:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Assert.IsTrue(true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

再次重建并检查程序集清单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...
Run Code Online (Sandbox Code Playgroud)

请注意,现在IL中有一个外部.这也提供反射,因此它知道要加载的依赖程序集.

过去那个小细节,正如其他人所说的那样,运行时实际上并没有加载一个程序集,直到第一次需要它,因此在你实例化或使用该程序集中的某些东西之前,你的AppDomain没有加载程序集.


当您开始尝试使用该Assembly.GetReferencedAssemblies()方法时,上面的详细信息将发挥作用.

所以在VisualStudio中,我有一个包含这些引用的项目:

Microsoft.CSharp
nunit.framework
System
System.Core
System.Data
System.Xml
System.Xml.Linq
Run Code Online (Sandbox Code Playgroud)

然后我有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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我甚至有一个using NUnit.Framework;声明!但我实际上并没有在任何地方使用 NUnit,因此它不是引用的程序集.运行它的输出是:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Run Code Online (Sandbox Code Playgroud)

这就对了.如果我将此行添加到我的测试应用中:

Assert.IsTrue(true);
Run Code Online (Sandbox Code Playgroud)

现在有些东西实际使用 NUnit,我的控制台输出是:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
nunit.framework, Version=2.6.0.12051, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77
Run Code Online (Sandbox Code Playgroud)