Nic*_*ick 8 .net gac reference circular-reference visual-studio
更新:昨晚,我决定更改保存某些报告的文件夹的工作太多了.我的解决方法是重命名文件夹,运行我需要完成的批处理作业,然后将文件夹名称更改回原来的名称.我觉得我今天剩下的时间都可以度过,下周所有人都在努力,但仍然没有任何表现.我宁愿因为反对我的老板而感到害怕而不能为我们的客户开具发票(每年只发生一次).感谢所有帮助过的人,我为你愿意帮助一些匿名家伙而感到谦卑.我不知道如何"放弃"这个问题,但仍然给你们道具,我会在午餐时阅读常见问题和任何评论.谢谢.
我正在尝试调试我的前任创建的ac#应用程序.他是一名程序员,我是一名系统管理员,也许这就是我出错的地方.
无论如何,我需要重新编译其中一个程序集并将其部署到我们的生产服务器.当我编译它时,我收到错误:
类型'Mcrcsip.Web.McrcsipWebExceptionBase在未引用的程序集中定义.您必须添加对程序集'Mcrcsip.Web,Version = 2.0.3266.28977,Culture = neutral,PublicKeyToken = c3de6c6abcdf794b'的引用.
我碰巧有一个该程序集的副本,当我删除对现有程序集的引用(2.0.0.0使用不同的公钥令牌)并添加对它所要求的程序集的引用,当我编译时,我得到此错误信息:
类型'Mcrcsip.Web.McrcsipWebExceptionBase在未引用的程序集中定义.您必须添加对程序集'Mcrcsip.Web,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 8bbdde85caf008d0'的引用.
如果我在google上搜索这个错误(当然是泛化的),我得到了一堆"这是你添加程序集引用的方法......"的结果.
我如何摆脱这个旋转木马?
以下是该解决方案的布局:
http://amwa-test.internal.lan/引用不一致或:我是如何学会如何停止担忧和爱ILDASM的
咳咳,咳嗽,
问题
缺口,
从重新阅读您的原始帖子,很明显您有一个DLL版本不一致问题.也就是说,您的解决方案中至少有一个项目依赖于Mcrcsip.Web版本X,并且您的解决方案中至少有一个项目依赖于Mcrcsip.Web版本Y [或者更糟糕的是,依赖于依赖于Mcrcsip.Web版本Y的库].追踪这些可能既困难又乏味.
请参阅推荐的解决方案以跳到最后.
怎么样
出现这种不一致的情况
与我们直觉所期望的相反,当我们构建A时,B将不会自动神奇地更新以使用C ver 2.A和B 必须引用相同的库才能正确构建.因此要么A必须符合C ver 1,要么B必须重建并符合C ver 2.
现在,这可能发生在任何项目配置中,这就是为什么对您的软件进行版本控制很重要[相信我没有正确的签名\版本化会使这个问题变得更糟],并且每当发生依赖关系更新时,您的团队内部就会很好地进行通信.
值得知道的是有两种依赖引用,硬性和软性[实际上,它们是相同的,即链接到dll,除了一个是另一个的特殊情况,并且在概念上它有助于区分两者].
硬参考文献
硬引用是项目与静态dll的依赖关系.也就是说,依赖项是在特定时间构建的,除非将其物理文件替换为新文件,否则永远不会更新.通过"添加引用"对话框将硬引用添加到解决方案中,并从.Net,COM或"浏览"选项卡添加引用.硬引用通常用于向当前解决方案范围之外开发的软件添加依赖关系[即框架,第三方和其他内部团队开发的其他第一方产品].硬引用也趋于陈旧,因为它们由自己的开发流维护和更新.
假设上面的情况
此外,假设A和B在同一解决方案中
构建A时,您将收到所描述的错误.A期望来自C v2的对象,但由于B对C v1具有硬依赖性,因此首先将C v1加载到内存中,并发生冲突.A期望v2并找到v1.那是你的错误.
要解决这种情况,您必须
软参考
软引用是项目与同一解决方案中的另一个项目的依赖关系.也就是说,每次重建整个解决方案时都会重建依赖关系.通过"添加引用"对话框将软引用添加到解决方案中,并从"项目"选项卡添加引用.软引用通常用于依赖添加到当前解决方案的范围内开发的软件,他们有传播变化的主要优势,因为它们是由消费者在同一解决方案中.由于这个事实,软引用不能陈旧.
[这是一个硬引用的特例,Visual Studio将添加一个指向目标项目输出路径的引用,我相信如果目标项目更改其输出配置,它也会更新此路径 - 但是一个非常方便的功能权证区分]
假设上面的情况
此外,假设A和B在同一解决方案中
构建A时,您将收到所描述的错误.A期望来自C v2的对象,但由于B对C v1具有硬依赖性,因此首先将C v1加载到内存中,并发生冲突.A期望v2并找到v1.那是你的错误.
解决,
如您所见,软引用更易于维护.
IL DASM [中级语言DisASeMbler]
既然您对引用和项目维护有了更多了解,那么您究竟如何确定构建的状态?毕竟,您的任何一个项目或其依赖项都可能不一致.
简单的方法是打开构建输出目录,并检查解决方案生成的每个dll的程序集清单.
要检查程序集的清单,
ildasm.exe
ildasm窗口中这是乏味和痛苦的,但如果遇到[非平凡] DLL不一致错误,这是找到它的唯一方法.
推荐解决方案
如果您在此步骤中仍然遇到错误,那么您就知道其中的一个或全部
分享您对Mcrcsip.Web的依赖,并引用旧版本.如果是这种情况,那么对于上面列出的每个硬参考
ildasm确保对上面三个硬引用中的每一个都执行此操作.一旦你确定这三个子集中的哪个子集引用了旧版本的Mcrcsip.Web,你现在可以找到该项目,更新其硬引用,重建它,然后最终更新你的硬引用,重建和瞧.鲍勃是你的叔叔.
唷.
Le fin
PS为冗长而道歉.这不是一个非常复杂的问题,但我相信你会同意,它涉及很多细节.我真的希望这会有所帮助.谢谢你的合作:)
PPS顺便说一句,我从你的评论中推断出原始开发者在所有地方都使用了硬引用[即使在相同的解决方案中].也许他有他的理由,但是imo,那就是屁股.
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |