问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C# dll编译问题

发布网友 发布时间:2022-05-12 07:57

我来回答

3个回答

热心网友 时间:2024-01-18 22:51

这个只有三楼说对了!

事实上我们在引用时自己开发的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的话,我同意,当然还得忍受这种原因导致你自己的进度缓慢)。

也正是因为如此,所以文件引用可能会出现的现象要知道怎么处理。

热心网友 时间:2024-01-18 22:52

重新引用撒,这有什么好说的 0.0

热心网友 时间:2024-01-18 22:52

说明bin文件里DLL版本不是最新的追问bin里的dll看生成时间,是刚刚生成的,程序里看dll的引用,路径也是对的。而且我为了保险起见,怕别的地方有旧的dll,我检索过同名的dll文件,都给删了。机器上没有旧版本的这个dll了。不知道为什么,就是不对

追答看版本号

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 我现在正在工行办房贷,还没办下来,我现在可以在工行办信用卡吗? DLL文件编译,高手请指教。 vb如何编译dll 我在工商银行办理的房贷,在工商银行办信用卡容易吗? 怎么在编译dll文件时将自己写的类的构造函数作为接口? 如何编译一个 dll文件 在工行才办的房贷,不用任何证明能办信用卡吗 在工行办理房贷,本人无社保,无单位,做生意,如何办理工行信用卡,直接去银行办理可以吗? 我在工行有房贷,可以办理信用卡么 石斛属中霍山石斛是最好的石斛吗 怎么从石斛中提取石斛碱? 石斛中的黏液是什么物质? 石斛中药材 石斛中的粘液是植物胶原蛋白吗? 谁解释下天蝎座吗? 天蝎座什么时候 你们了解天蝎座吗 有天蝎座吗 能再告诉我关于天蝎座的吗? 天蝎座是什么样子的 我在工行有房贷,办信用卡还需要提交什么没? C语言程序怎么编译成dll文件供其他语言调用? 求助,编译DLL出现错误 编译DLL时显示,无法启动程序,该怎么处理 MATLAB程序如何编译产生DLL? 怎么样才能打开DLL文件进行编译? 如何动态编译生成自定义DLL文件 .net CS文件编译成DLL 易语言编译DLL文件 朱角镇在上海的位置 在曹杨路地铁站座几号地铁去朱角镇 有多个卫生间的房子装哪种热水器好而实用? 昆山到上海青浦区朱角镇有多远 浴室安装热水器,选什么样的好? 从上海市胸科医院到朱角镇怎么走 上海市文化名镇朱家角镇形成于哪个年代 STC89C52RC单片机不能下载程序? 明年人民币会贬值吗 苹果手机显示无法安装此app stc89c52单片机下载程序时一直停在 “正在检测目标单片机” 怎么解决?