-2

在运行时,我想加载一个程序集并需要找到它的依赖程序集的名称,以便我可以确定执行给定的 DLL 文件需要哪些程序集。

4

3 回答 3

5

您需要将程序集(DLL 文件)加载到Reflection-Only context 中

之后,您可以使用GetReferencedAssembles查找依赖项。

于 2013-04-16T11:08:01.310 回答
4

我前段时间在一段讨厌的代码中使用了它:

在您加载程序集的地方,注册 resolve 事件:

AppDomain.CurrentDomain.AssemblyResolve += Assemblies_AssemblyResolve;
Assembly.LoadFile("<path to your assembly>");
AppDomain.CurrentDomain.AssemblyResolve -= Assemblies_AssemblyResolve;

为每个引用的 dll 调用解析事件处理程序。在这里我尝试加载程序集。

Assembly Assemblies_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.RequestingAssembly != null)
    {
        return LoadAssemblyFromPath(new AssemblyName(args.Name), args.RequestingAssembly.Location);
    }

    if (assemblyTryPath != null)
    {
        return LoadAssemblyFromPath(new AssemblyName(args.Name), assemblyTryPath);
    }

    return null;
}

还有一个实际加载发生的小帮手:

private Assembly LoadAssemblyFromPath(AssemblyName assemblyName,string fullPath)
{
    if (assemblyName == null||fullPath==null)
        return null;

    string path = Path.GetDirectoryName(fullPath);
    string dllName = assemblyName.Name + ".dll";
    string fullPath2Try = Path.Combine(path, dllName);

    Assembly loadedAssembly = Assembly.LoadFrom(fullPath2Try);

    return loadedAssembly;
}

希望,这有帮助!

于 2013-04-16T11:18:04.443 回答
1

我找到了答案。如果我们想找到卸载程序集的引用程序集,我们可以通过以下方式找到。

Assembly _Assembly = Assembly.ReflectionOnlyLoadFrom(@"H:\Account.dll");
AssemblyName[] _AN = _Assembly.GetReferencedAssemblies();
于 2013-04-17T06:54:29.670 回答