【问题标题】:Dynamically Load Assembly and manually force path to get referenced assemblies动态加载程序集并手动强制路径以获取引用的程序集
【发布时间】:2010-12-24 20:40:21
【问题描述】:

我正在使用反射在 C# 中加载程序集:

Assembly = Assembly.Load([assembly_bytestream]);

正在加载的程序集引用另外两个程序集。据我了解,反射将加载主程序集,然后在 GAC 中搜索引用的程序集,如果在其中找不到,则可以合并一个 assemblyResolve 事件:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
  if (args.Name.IndexOf([refAsm]) > -1)
  {
    Assembly shdocvw = Assembly.LoadFrom([dllPath]);
  }
}

问题是,我不想先查看 GAC,我想强制反射从我定义的特定路径加载引用程序集。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    在加载需要依赖的程序集之前,您可以自己加载依赖程序集。

    【讨论】:

    • 嗨 Slaks 你是说反射会在检查 GAC 之前检查内存流吗?
    • 如果程序集已经加载,它不会再次尝试加载。
    • 听起来很简单。我会试试这个。谢谢
    • 嘿 Slaks,你帮我指明了正确的方向。不过我后来做了。基本上是先加载主汇编:Assembly asm = Assembly.Load([assembly_bytestream]);然后获取所有引用并循环通过它们寻找我想要从特定位置而不是 GAC 加载的特定文件:AssemblyName[] references = asm.GetReferencedAssemblies(); foreach (AssemblyName asmName in references) { if (asmName.FullName.Contains([name_of_ref_asm])) { Assembly shdocvw = Assembly.LoadFrom([dllPath]); } }
    【解决方案2】:

    据我了解,反射将加载主程序集,然后在 GAC 中搜索引用的程序集

    正确,但还有一个重要的细节:框架会先查看应用程序域的搜索路径,然后再查看 GAC。通常,应用程序域搜索路径仅包含主 EXE 所在的目录,尽管您也可以通过app.config 或通过启动第二个应用程序域并以编程方式对其进行配置来配置您的应用程序以查看特定子目录。

    您引用的程序集相对于您的应用程序的 EXE 位于何处?

    编辑:在调试此类问题时,我总是参考Suzanne Cook's assembly load cheat sheet。她博客的其余部分充满了类似的有用信息。

    【讨论】:

    • 嗯,它是一个 ClickOnce 应用程序,因此 exe 位于应用程序文件夹中的用户 ClickOnce 缓存下。 clickOnce 应用程序调用一个向下传递字节流(有问题的程序集)的 Web 服务。相关程序集的引用程序集位于应用程序文件夹中。
    • 那么您要查看的具体路径是什么?原来的 ClickOnce 位置?如果是这样,这应该已经工作了。如果它不起作用,查看附加到由程序集加载失败触发的异常的融合日志会很有帮助。
    • 程序集确实加载成功,但它是从 gac 加载的。我要指定路径。
    • 哪个路径 - ClickOnce 部署目录?如果是这样,您的应用程序目录和 GAC 中都部署了具有相同名称、版本号、公钥令牌和名称的程序集。它们不是同一个二进制文件吗?
    • 在这种情况下,从命令行生成您自己的互操作(使用 TlbImp.exe)并给它们一个特定的名称和/或使用您自己的私钥对其进行签名可能会更安全。特别是,如果您将自己的私钥提供给他们,则可以保证他们不会与其他任何人的程序集发生冲突。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多