【问题标题】:Getting Information about a assembly which is present in Solution获取有关解决方案中存在的程序集的信息
【发布时间】:2012-10-11 10:17:59
【问题描述】:

场景:我想在运行时加载解决方案中存在的程序集。

belo 代码将不起作用,因为它不存在于当前应用程序域中。

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

此外,如果我将在引用的程序集中进行搜索,那么它也无法找到,因为它没有被引用。所以下面的代码也不起作用:

public static IEnumerable<Assembly> GetAssemblies()
    {
        var list = new List<string>();
        var stack = new Stack<Assembly>();

        stack.Push(Assembly.GetEntryAssembly());

        do
        {
            var asm = stack.Pop();

            yield return asm;

            foreach (var reference in asm.GetReferencedAssemblies())
                if (!list.Contains(reference.FullName))
                {
                    stack.Push(Assembly.Load(reference));
                    list.Add(reference.FullName);
                }

        }
        while (stack.Count > 0);

    }

你有什么建议吗?

【问题讨论】:

  • 您是说要动态加载程序集吗?如果是这样,程序集将不会出现在 AppDomain 中。您可以使用 Assembly.Load() 从磁盘加载 DLL 文件。
  • Assembly.Load() 将需要一个路径,我不想在我的代码中硬编码任何东西。你能告诉我如何在不指定路径的情况下实现这一点吗?
  • 如果不指定路径,它就不会知道文件的位置。如果没有硬编码,您可以将位置放在 App.config 文件中,因此 DLL 位置是可变的。
  • 但在 App.Config 中我还需要输入硬代码路径,我认为这在其他机器上不起作用。如果我在这里错了,请纠正我?
  • 也许您可以明确说明您想要做什么?

标签: reflection assembly-loading


【解决方案1】:

Sign your assembly,然后在您的 app.config 中指定 fully qualified assembly name。调用 Assembly.Load(string),从 app.config 传递程序集名称。

注意:您尝试加载的程序集必须位于运行时可以找到它的位置。最好的办法是将其放入 Global Assembly Cache,或者确保它与正在执行的程序集位于同一文件夹中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多