zoukankan      html  css  js  c++  java
  • .Net利用反射调用DLL时,被调用DLL引用其它库问题

    项目中利用反射加载dll,部署要求所有dll放在指定的文件夹,与主程序不在一起,测试使用Assembly.LoadFile,一切正常,直到有的dll还引用其它dll时碰到问题,查msdn解释改为LoadForm正常


    另:Assembly.LoadFile 与 Assembly.LoadFrom的区别


    1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,如果a.dll中引用了b.dll的话,b.dll并不会被载入。


    Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入。


    2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2//abc.dll")载入版本2时,不能载入,而是返回版本1。Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。


    LoadFile:加载指定路径上的程序集文件的内容。LoadFrom: 根据程序集的文件名加载程序集文件的内容。


    区别:


    LoadFile 方法用来来加载和检查具有相同标识但位于不同路径中的程序集.但不会加载程序的依赖项。


    LoadFrom 不能用于加载标识相同但路径不同的程序集


    MSDN上对三种加载方式解释:

    1、Assembly Load()

    是否向程序集授予一定的权限要视证据而定。程序集和安全证据的合并规则如下所示:

    • 当使用不带 Evidence 参数的 Load 方法时,将用加载程序提供的证据加载程序集。

    • 当使用带有 Evidence 参数的 Load 方法时,将对各项证据进行合并。作为 Load 方法的参数提供的各项证据将替代由加载程序提供的各项证据。

    • 当使用带有 Byte[] 参数的 Load 方法加载通用对象文件格式 (COFF) 图像时,将对证据进行合并。Zone、 Url 和 Site 从调用程序集继承,而 Hash 和 StrongName 从 COFF 程序集中获取。

    • 当使用带有 Byte[] 参数和 Evidence 的 Load 方法加载通用对象文件格式 (COFF) 图像时,只使用提供的证据。将忽略调用程序集和 COFF 图像的证据。

    在 C++ 可执行文件上反射可能会引发 BadImageFormatException。造成这种情况的原因极有可能是 C++ 编译器去除了可执行文件中的重定位地址或 .Reloc 部分。若要保留 C++ 可执行文件的 .reloc 地址,请在链接时指定 /fixed:no。

    
    
    2、Assembly LoadFrom()
    
    

    LoadFrom 方法具有以下缺点。请考虑改用 Load

    • LoadFrom 方法具有以下缺点。请考虑改用 Load。

    • 如果已加载一个具有相同标识的程序集,则即使指定了不同的路径,LoadFrom 仍返回已加载的程序集。

    • 如果用 LoadFrom 加载一个程序集,随后加载上下文中的一个程序集尝试加载具有相同显示名称的程序集,则加载尝试将失败。对程序集进行反序列化时,可能发生这种情况。

    • 如果用 LoadFrom 加载一个程序集,并且探测路径包括具有相同标识但位置不同的程序集,则发生 InvalidCastException、MissingMethodException 或其他意外行为。

    • LoadFrom 要求指定路径中包含 Read 和 F:System.Security.Permissions.FileIOPermissionAccess.PathDiscovery 或 WebPermission。

    • 如果 assemblyFile 存在本机图像,则不使用它。程序集不能加载为非特定域。

    • 策略不适用于 .NET Framework 1.0 和 1.1 版。

    是否向程序集授予一定的权限要视证据而定。程序集和安全证据的合并规则如下所示:

    • 当使用不带 Evidence 参数的 LoadFrom 方法时,将用加载程序提供的证据加载程序集。

    • 当使用带有 Evidence 参数的 LoadFrom 方法时,将对各项证据进行合并。作为 LoadFrom 方法的参数提供的各项证据将替代由加载程序提供的各项证据。

    • 当使用带有 Byte[] 参数的 LoadFrom 方法加载通用对象文件格式 (COFF) 图像时,将对证据进行合并。Zone、 Url 和 Site 从调用程序集继承,而 Hash 和 StrongName 从 COFF 程序集中获取。

    • 当使用带有 Byte[] 参数和 Evidence 的 LoadFrom 方法加载通用对象文件格式 (COFF) 图像时,只使用提供的证据。将忽略调用程序集和 COFF 图像的证据。

    3、Assembly LoadFile()

    使用 LoadFile 方法来加载和检查具有相同标识但位于不同路径中的程序集。与 LoadFrom 不同,LoadFile 不会将文件加载到 LoadFrom 上下文中,也不会使用加载路径解析依赖项。LoadFile 在这个受限制的方案中很有用,因为 LoadFrom 不能用于加载标识相同但路径不同的程序集;它只加载第一个这样的程序集。



  • 相关阅读:
    springmvc入门详解
    getClass 与getSimpleName
    mybati的存储过程
    mybatis与spring的整合
    mybatis分页插件以及懒加载
    mybatis知识总结
    【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
    【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
    【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    【Java面试题】27 多线程笔试面试概念问答
  • 原文地址:https://www.cnblogs.com/whisht/p/3085062.html
Copyright © 2011-2022 走看看