我们有一个.net 2008应用程序,它使用两个dll来远程访问服务器以获取信息。返回的对象。这个对象的一个属性是枚举,它保存在第三个dll中。
出于某种原因,当我们构建第三个dll时没有被添加,尽管我现在已经将所有三个dll都包含在解决方案中。
在运行时,当代码反序列化对象时,我们得到一个dll未找到异常,指定dll丢失,对于有问题的dll,它只包含枚举(不是我的设计)
我知道如何强制添加dll?
我可以添加dll作为线束或服务的一部分,但我不应该因为它应该被选为主项目的依赖项
答案 0 :(得分:3)
那是因为你不需要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”指令。
显然你已经发现了皱纹,在你的问题中放入这样的细节是非常重要的。是的,二进制序列化将在序列化数据中放置类型引用,这是编译器无法看到的。唯一的解决方法是确保将程序集复制到构建目录中。项目+添加现有项目,导航到DLL。在Solution Explorer窗口中选择它,将Copy to Output Directory属性设置为“Copy if Newer”。
答案 1 :(得分:1)
使用post-build event命令将dll添加到bin目录中。
答案 2 :(得分:0)
您是否在参考属性中将“Copy Local”标志设置为true?