【问题标题】:GetReferencedAssemblies doesn't return all assembliesGetReferencedAssemblies 不返回所有程序集
【发布时间】:2010-08-08 10:32:56
【问题描述】:

我在表单中有以下代码,并试图找到一种方法来加载名为DataObjects 的表单引用的项目程序集。使用以下代码,我只列出了六个程序集。查看表单所在项目的引用,有 13 个程序集引用。这里有什么问题?

private void ListReferencedAssemblies()
{
    var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
    foreach (var assembly in assemblies)
    {
        referencesListBox.Items.Add(assembly.Name);
    }
} 

【问题讨论】:

    标签: .net reflection


    【解决方案1】:

    您能否检查程序集的清单以查看此处引用的内容?

    如果不使用,C# 编译器倾向于从清单中删除引用的程序集。因此,如果您不引用程序集 B 中的任何类型或仅引用程序集 B 中的常量(由编译器内联),那么您将没有此引用。

    【讨论】:

    • 有没有办法强制加载“未使用”的程序集?
    • Assembly.Load() 如果您知道在当前域中加载的位置或编写一些虚拟代码来引用“未使用”程序集中的类型。
    • 我相信你(我现在遇到了同样的问题),但你有消息来源吗?
    • @AndreyTaptunov:“或者编写一些虚拟代码” - 不幸的是,只有当程序集包含任何公共类型时才有可能。
    【解决方案2】:

    编译器不会在输出程序集中包含代码中实际未使用的程序集引用。

    只有从代码中使用的程序集才会在输出程序集中被引用。

    【讨论】:

    • “实际上并没有在代码中使用” - 我认为这应该以不同的方式编写。当我调用的东西依赖于通过反射(在我的情况下,通过 MEF)发现的类型的存在时,这些类型被使用。也就是说,如果编译器没有删除引用并因此使我的应用程序崩溃,它们将被使用。
    • 如果引用是通过反射“使用”的,那真的很痛苦。
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多