【问题标题】:What when assembly.GetReferencedAssemblies returns ".exe" dependency?当 assembly.GetReferencedAssemblies 返回“.exe”依赖项时怎么办?
【发布时间】:2011-04-27 16:09:12
【问题描述】:

有很多示例如何从某个程序集中加载所有依赖项,例如:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
foreach (var assemblyName in assembly.GetReferencedAssemblies()) {
  try {
    Assembly.ReflectionOnlyLoad(assemblyName.FullName);
  } catch {
    Assembly.ReflectionOnlyLoadFrom(Path.Combine(Path.GetDirectoryName(assemblyPath), assemblyName.Name + ".dll"));
  }
}

但是如果依赖项之一不是“.dll”而是“.exe”怎么办?我是否需要该“.exe”程序集再次在 foreach 循环中递归调用 GetReferencedAssemblies() ?是否存在循环依赖的危险?

br, 米兰

【问题讨论】:

    标签: c# reflection dll dependencies exe


    【解决方案1】:

    您应该能够像使用任何其他 dll 一样使用 exe。 它只是有这个额外的好处,它可以独立执行。

    【讨论】:

    • 第一个问题是如何识别一些 assemblyName 是 exe ?我只知道它的名字,例如“我的文件”,但没有扩展名。就我而言,我知道“MyFile”是 exe,但一般情况下我不知道它的扩展名,所以我给出的代码示例的最后一行会给出异常。如何处理,任何想法?另一个异常处理程序太多了......
    • Assembly.CodeBase 应该告诉你文件名。 System.IO.File... 应该使您能够获得扩展名,但我认为一旦您有了文件名,您就不再需要文件扩展名了。
    【解决方案2】:

    作为 dll 的程序集可以和 exe 一样引用其他程序集;从这个角度来看,它们之间没有区别。

    【讨论】:

    • 请看我对 Simpzon 答案的评论。
    【解决方案3】:

    如前所述,就引用而言,您可以将 .exe 视为 .dll。

    至于担心循环引用,如果有的话,那些库会编译吗?只是一个想法。

    这里有一些快速的递归代码来获取所有依赖的程序集:

        private static IEnumerable<Assembly> GetAllDependencies(Assembly assembly)
        {
            var dict = new Dictionary<string, AssemblyName>();
            dict.Add(assembly.GetName().FullName, assembly.GetName());
            dict = GetAllDependenciesRecursive(assembly.GetName(), dict);
            return dict.Select(d => Assembly.Load(d.Value)).ToArray();
        }
    
        private static Dictionary<string, AssemblyName> GetAllDependenciesRecursive(AssemblyName assemblyName, Dictionary<string, AssemblyName> existingRefList)
        {
            var assembly = Assembly.Load(assemblyName);
            List<AssemblyName> a = assembly.GetReferencedAssemblies().ToList();
            foreach (var refAssemblyName in a)
            {
                if (!existingRefList.ContainsKey(refAssemblyName.FullName))
                {
                    existingRefList.Add(refAssemblyName.FullName, refAssemblyName);
                    existingRefList = GetAllDependenciesRecursive(refAssemblyName, existingRefList);
                }
            }
            return existingRefList;
        }
    

    【讨论】:

    【解决方案4】:

    GetReferencedAssemblies() 不会返回整个依赖树(dll 或 exe 没有区别),因此您需要一个遍历树的解决方案。见这篇文章http://msdn.microsoft.com/en-us/magazine/cc163641.aspx

    【讨论】:

    • 如果 GetReferencedAssemblies 不返回所有程序集,是否有使用反射方法检索所有依赖项的选项?
    • 文章解释了如何使用 GetReferencedAssemblies() 方法获取所有依赖项。至于返回整棵树的单个方法,我自己不知道。
    • 死链接。糟糕的是,您实际上并没有将内容放入答案中:(
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多