代码之家  ›  专栏  ›  技术社区  ›  Kev Hunter

为什么我们的构建不包含所有必需的dll

  •  0
  • Kev Hunter  · 技术社区  · 16 年前

    在运行时,当代码反序列化对象时,我们会得到一个dll not found异常,指定dll丢失,对于所讨论的dll,它只包含枚举(不是我的设计)

    我可以将dll作为工具或服务的一部分添加,但我不必这样做,因为它应该作为主项目的依赖项进行选择

    3 回复  |  直到 16 年前
        1
  •  3
  •   Hans Passant    16 年前

    那是因为你不需要DLL。枚举赋值被编译为其数值,IL中没有该类型的引用。例如,这:

    public enum Numbers { Zero, One, Two, Three }
    
    static void Main(string[] args) {
      var n = Numbers.One;
    }
    

    编译为以下内容:

      IL_0001:  ldc.i4.1          ; NOTE: constant 1 being used here
      IL_0002:  stloc.0
    

    编译器会自动过滤掉未实际使用的程序集的“using”指令。


    很明显,你发现了一个问题,在你的问题中加入这样的细节是非常重要的。是的,二进制序列化将在序列化数据中放置类型引用,这是编译器无法看到的。唯一的解决方法是确保将程序集复制到生成目录中。Project+添加现有项,导航到DLL。在“解决方案资源管理器”窗口中选择它,将“复制到输出目录”属性设置为“如果更新,则复制”。

        2
  •  1
  •   HotTester    16 年前

        3
  •  0
  •   Simon Holman    16 年前

    您是否在参考属性中将“复制本地”标志设置为true?

    推荐文章