代码之家  ›  专栏  ›  技术社区  ›  Seattle Leonard

dll是通过反射加载的-幻影错误

  •  1
  • Seattle Leonard  · 技术社区  · 15 年前

    所以我有一个通过反射加载一堆dll的web应用程序。基本上,它会查找从某些抽象类型派生的类型,并将它们添加到它可以生成的对象列表中。

    奇怪的是。

    在发展的过程中从来没有问题。在安装时,一开始就没有问题。然后,在一个看似随机的时间,应用程序在试图查找所有类型时中断。

    我只是把所有的dll从bin目录中移出,然后把它们移回来。是的,我只是把它们从bin目录中移出,然后放回原来的位置,一切正常。

    有更多信息吗

    IISRESET之后,它仍然可以工作,但是回收应用程序池会导致它崩溃。

    当站点被破坏时: 不管是重新设置还是回收应用程序池都可以修复它,但是 将单个dll移出,然后再移入修复了它。

    所以事实证明 IsAssignableFrom

    更多信息

    那个特殊的班级 在与其他类位于文件中的中失败。如果我将类移到它自己的文件中,那么一切都正常。但是,如果它与其他类在同一个文件中(即使它在自己的文件中) namespace 块)然后 Type 参考文献全错了。这个 引用将具有正确的名称和方法,但很难找到正确的构造函数。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Matthew Whited    15 年前

    同一程序集的两个(或多个)副本可能正在加载到内存中。为自己节省时间和头痛的最好方法是对程序集设置强键。如果存在强命名密钥,则每个appdomain只能加载程序集的一个实例。

    More info 关于程序集绑定上下文。

        2
  •  2
  •   Femaref    15 年前

    在其他情况下,添加加载代码的扩展日志记录,以跟踪抛出的异常。

        3
  •  0
  •   adrianbanks    15 年前

    这个 归结到锁定问题。默认情况下,bin目录中的所有DLL都由ASP.Net加载,即使它们没有在web应用程序中使用。如果您试图从特定的dll加载类型,而ASP.Net正在将该dll加载到内存中,则可能会由于文件正在使用而出现错误。这可能会表现为你所经历的行为,因为它会造成某种竞争状况,并且只会在某些事件发生而其他特定事件正在发生时作为错误出现-即使只有一个用户在使用该站点。这也可以解释为什么你不总是得到这种行为。

    要停止这种情况,可以将动态加载类型的dll放入bin目录中的一个目录,然后从那里加载它们。