C# dll编译问题
这个只有三楼说对了!
事实上我们在引用时自己开发的dll时存在两种引用方式:
引用时选择的是项目(dll项目也在项目资源管理器中),这里引用最直接,原则上是使用这种引用的方式。
引用时选择的是文件(直接引用了文件夹中指定的dll),这里引用其实一般用于不一个项目资源管理器时的使用(因为这个dll的源码你无法拿到,或者为了不允许你更改,要求你引用文件而不是项目)
当然,如果条件允许,引用前可以在资源管理器先添加已存在的项目(当然是你要引用的那个项目),然后按第一种引用方式引用!
两种引用方式有一定的区别:
引用项目其实是在项目资源管理器中形成一个依赖关系,这个可以在项目管理管理器上右面查看项目依赖关系(不是在项目上右击,不是在项目上右击,不是在项目上右击,重要的事说三遍,因为很多人连项目与项目资源管理器都没分清!)正是因为有这个项目依赖的关系,所以IDE在编译时会按照依赖关系进行生成——也就是说被引用项目要比引用项目先生成!当然了,我见过一些“牛X"程序员把自己项目中乱写一通,最后形成了一个环状引用,还告诉我说找到了vs的bug,项目生成失败,而且无解!汗了~~自己原理不清楚,你以为臭虫那么好捉?
之所以这么说,就是因为其实你每次生成时,由于依赖关系的原因,引用的永远是最后的dll,不管是有人解释为“所有项目重新生成了,所以能引用到最新的”,还是解释为“直接引用了被引用项目bin中的文件”,还是解释为“通知了依赖项项目更新引用文件”等等不影响你使用的,而且在被引用生成之后,其他的引用都是新的。
第二种其实是引用了一个副本文件!不管你在不在同一项目资源,只要是直接引用文件的这种,都实都是将文件copy到了object文件夹中,而这个文件夹的文件在生成时会生成到bin文件夹中!也有人理解为copy到了bin文件夹中,但是他们搞不清楚——类似于以上文件明明引用源中的dll已经更新,而bin中copy的怎么还是旧文件呢?其实文件引用方式是引用到项目中一个中间文件中了,这个文件并没有在vs上显示(文件组中存在,有些还是隐藏的),众所周知的是bin只有在编译的时候才会生成,所以很多人会以为copy源dll文件也是此时生成的,事实上根本上不是!而是你在引用时已经将文件copy到了隐藏的目录中!在生成时再将其copy到bin中!所以即引源文件夹的内容已经改变,这个文件也不会再发生错误了!如果这样理解了,那么楼主的问题就已经知道原因了!
如果是项目引用,不用管的,引用的永远是最新的dll!
如果是文件引用,在dll更新时,应该在项目中引用文件夹中找到文件,然后右击“刷新引用”即可!这个方式相当于再次从将源dll copy到中间object目录中。当然,开发过程中使用的就是新的dll了!另一种方式更绝,就是删除引用文件,重新引用(这绝对可行,但怎么也不那么优雅,人家原因的dll位置又没换)!
如果让我根据楼主的描述,我猜你使用的也是文件引用方式!那么知道文件引用方式,怎么解决就不成问题了!
你一定奇怪,为什么还要有文件引用方式?我想引用哪个直接把那个项目添加到我的项目资源管理器中不就行了?就算两台机器上,copy一个dll也是copy,把整个的项目拷贝过来不也行吗(大多时候我们使用TFS时,可以直接将项目拉回来的)?为什么会存在这样文件引用呢?它的作用就为了解决我们拿不到源码无法添加到项目中而出现的引用方式吗?答案是肯定的,但只是一部分原因!我来告诉你另一部分的原因!
Fake!Fake!Fake! 如果你懂这个单词,那么一定知道我的意思,如果不懂我来告诉你吧,这个单词就是“假的”!如果dll开发是一个任务(develop task), 而引用该dll的应用软件或中间件也是一个任务(delevop task),在正常的开发关系上来说,dll开发任务是应用开发的前驱,也就是正常的需要dll开发完成后才进行应用软件的开发(很多人的模式都是这样的),但现在情况是,dll开发需要5天,而应用开发也需要5天,产品却要7天内交付!那么是说两个任务要同时进行develop! 怎么办?怎么办?应用开发程序员却说你没dll让我怎么引用——听起来很有道理,不少管理者向dll开发team压压力,你们在两天内加班完成,我给你们放5天假!事实上两天内加班完成的dll其实质量可想而知!为什么不Fake呢!
Fake的意思就是应用开发人员引用一个“假的”dll! 标记为Fake的引用文件非常好玩——你可以在开发中试一下!它只需要在成品是组合一下就可以了(因为引用文件会使用其文件的版本/哈希值/空间等相关校验,而这个即更是更新后的文件也存在有些值不一样——如publicToken值,而引用Fake则就是解决了这个问题)!
所以说文件引用的方式同时还是打破任务前驱方式的一种行为,有利于扁开化安排开发时间!所以文件引用也存在其实必要的因素!
无源码时的引用(只提供了dll没提供源码),比如某些SDK等,一般用于稳定的成熟的,基本上更新不大的dll文件使用。
分支版本控制(由于开发过程中存在诸多的分支版本)应用程序员无法分清楚或不需分清楚分支版本时,引用源码则会对应用开发造成一定的混淆,当然在dll开发立场上他们当然知道该用哪个版本的源码,对于应用开发的team,没有必要增加他们学习时间。各版本的区别他们并不知道细节。
Fake引用!并行开发成为可能性(虽然可以引用另一个团队的dll源码,如果你愿意每次生成时都更新他们的源码——他们有可能同时在改动,还要以无比的关爱来忍受他们的千奇百怪的bug的话,我同意,当然还得忍受这种原因导致你自己的进度缓慢)。
也正是因为如此,所以文件引用可能会出现的现象要知道怎么处理。
bin里的dll看生成时间,是刚刚生成的,程序里看dll的引用,路径也是对的。而且我为了保险起见,怕别的地方有旧的dll,我检索过同名的dll文件,都给删了。机器上没有旧版本的这个dll了。不知道为什么,就是不对
看版本号