【问题标题】:How to get a list of all referenced assemblies (loaded or not)如何获取所有引用程序集的列表(已加载或未加载)
【发布时间】:2015-08-17 13:10:15
【问题描述】:

我正在尝试获取我加载到 MEF 中的主应用程序中的程序集的引用程序集列表。

我想在运行插件之前确保所有引用的程序集都存在于文件夹中。

我尝试过使用

List<AssemblyName> a = Assembly.GetEntryAssembly().GetReferencedAssemblies().ToList();

但是当我这样做时,它只显示我在那个阶段使用/加载的程序集。我想要一个引用的程序集的完整列表(在运行时)(VS 中引用文件夹的副本),无论它们当时是否被使用或根本没有使用。

【问题讨论】:

    标签: c# .net .net-assembly


    【解决方案1】:

    在加载插件之前,您可以加载它以仅用于反射,这将仅加载文件的元数据。例如:

        var assm = Assembly.ReflectionOnlyLoadFrom(@"Same.dll");
        var reff = assm.GetReferencedAssemblies();
    

    请记住,关联的库可以有它们的引用。

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的,并描述何时使用它。从长远来看,纯代码的答案没有用处。
    • @Juan 我尝试了你的两种方法,它们都返回相同的列表。这是我期望和得到的图片。绿点表示结果列表中包含的参考文献,红点表示未包含的参考文献。 i58.tinypic.com/169glly.png
    • 因为这些库不在您的库中使用,并且元信息不包含有关它们的信息。
    • @MIVer,那我很困惑,对不起。因为当我删除其中任何一个引用时,由于缺少引用而无法编译我的项目?
    • 嗯.. 可能这些库需要依赖项中列出的库之一,我在上面写过。我认为你不仅需要实现依赖分析,还需要实现递归依赖分析。
    【解决方案2】:

    您可以从文件元数据中提取该信息。最快的方法可能是使用其中一个库来执行此操作。

    例如你可以使用Mono.Cecil

    像这样:

    var md = ModuleDefinition.ReadModule(assemblyPath);
    foreach (var reference in md.AssemblyReferences)
    {
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多