为什么我们的版本不包含所有需要的DLL

问题描述:

我们有一个.net 2008应用程序,它使用两个DLL远程访问服务器以获取信息。返回的对象。这个对象的属性之一是在第三个DLL中保存的枚举。为什么我们的版本不包含所有需要的DLL

由于某些原因,当我们构建第三个DLL时并未被添加,尽管事实上我现在已经在解决方案中包含了所有三个DLL。

在运行时代码deserialises未发现异常指定的DLL文件丢失,对于有问题的DLL,我们得到一个DLL的对象,它仅包含枚举(不是我设计)

任何想法我怎么能强制该dll被添加?

我可以再补充的DLL作为线束或服务的一部分,但我不应该,因为它应该拿起作为主要项目

这是因为你不需要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 

编译器会自动过滤掉“使用”对于未实际使用的组件的指令。


显然,你已经找到了皱纹在此,你把细节像这样在你的问题是非常重要的。是的,二进制序列化将在序列化数据中放入一个类型引用,这是编译器无法看到的。唯一的解决方法是确保程序集被复制到构建目录中。项目+添加现有项目,导航到DLL。在Solution Explorer窗口中选择它,将Copy to Output Directory属性设置为“Copy if Newer”。

+0

好的学习.. – waheed 2010-02-08 13:03:44

+1

当代码反序列化的对象我们得到一个DLL没有找到异常,指定该DLL丢失,对于有问题的dll,它只包含枚举(不是我的设计) – 2010-02-08 13:08:05

你有“复制本地”标志的依赖在参考特性中设置为true?

+0

是的,它被选中 – 2010-02-08 11:57:43

使用post-build event命令将dll添加到bin目录中。

+3

这是比我想要更多hacky – 2010-02-08 12:04:16

+0

它不hacky!微软提供此功能来执行任何无法由.net本身处理的特定工作。 – HotTester 2010-02-08 12:22:17

+0

.net通常不会计算应用程序需要哪些dll才能工作?该解决方案依赖于dll,因此应该自动将其复制到调试或发布文件夹中。 – 2010-02-08 12:25:10