.net - .NET程序集引用对我来说是一个循环

标签 .net visual-studio reference gac circular-reference

更新:昨晚,我认为更改保存某些报告的文件夹的工作量太大。我的解决方法是重命名文件夹,运行需要完成的批处理作业,然后将文件夹名称更改回原来的名称。我觉得我可以花今天的其余时间和下周的所有时间进行此工作,但仍然没有任何显示。我宁愿与老板抗衡,也不愿为客户开票(每年仅发生一次)。谢谢所有帮助过的人,我很高兴您愿意帮助他的头上的一些匿名小伙子。我不确定如何“放弃”这个问题,但仍然会给你们一些道具,我将在午餐期间阅读常见问题解答和任何评论。谢谢。

我正在尝试调试我的前任创建的C#应用​​程序。他是程序员,我是系统管理员,也许那是我出问题的地方。

无论如何,我需要重新编译其中一个程序集并将其部署到我们的生产服务器中。编译时,出现错误:


在未引用的程序集中定义了类型'Mcrcsip.Web.McrcsipWebExceptionBase。您必须添加对程序集'Mcrcsip.Web,Version = 2.0.3266.28977,Culture = neutral,PublicKeyToken = c3de6c6abcdf794b'的引用。


我碰巧有该程序集的副本,当我删除对现有程序集的引用(2.0.0.0,具有不同的公钥令牌)并添加了对它所要求的程序集的引用时,在编译时出现此错误信息:


方式
'Mcrcsip.Web.McrcsipWebExceptionBase
是在一个装配体中定义的
未引用。您必须添加一个
引用程序集“ Mcrcsip.Web,
版本= 2.0.0.0,文化=中性,
PublicKeyToken = 8bbdde85caf008d0'。


如果我在google(当然是通用的)上搜索此错误,则会得到一堆“这就是您如何添加程序集引用...”的结果。

我如何下这个旋转木马?

解决方案的布局如下:


Mcrcsip.Amwa。解决方案


http://amwa-test.internal.lan/
Mcrcsip.Amwa.Core


麦克尔·西普·鲍尔斯
麦卡西普
网页
nunit.framework
系统
系统配置
系统数据
系统企业服务
System.Web
System.Web.Services
系统XML

Mcrcsip.Amwa.CrFactory


CrystalDecisions.CrystalReports.Engine
CrystalDecisions.Enterprise.Framework
CrystalDecisions.Enterprise.InfoStore
CrystalDecisions.ReportSource
CrystalDecisions.Shared
CrystalDecisions.Web
Mcrcsip.Amwa.Core
网页
系统
系统配置
系统数据
系统绘图
System.Web
系统XML

Mcrcsip.Amwa.PdfFormHandler


itextsharp
Mcrcsip.Amwa.Core
网页
系统
系统配置
系统数据
System.Web
系统文件

麦克斯·阿姆瓦网


Mcrcsip.Amwa.Core
Mcrcsip.Amwa.CrFactory
Mcrcsip.Amwa.PdfFormHandler
麦考斯证券
麦卡西普
Mcrcsip.SharePoint
网页
系统
系统配置
系统数据
System.EnterpriseServices
System.Web
System.Web.Services
系统XML

Mcrcsip.Amwa.WebControls


系统
系统数据
系统设计
系统绘图
System.Web
系统文件

Mcrcsip.Amwa。设置

最佳答案

参考不一致或:我如何学习如何停止担心和爱ILDASM

咳嗽,咳嗽,

问题

缺口,

通过重新阅读您的原始文章,很明显您遇到了dll版本不一致的问题。也就是说,解决方案中的至少一个项目依赖于Mcrcsip.Web版本X,解决方案中的至少一个项目取决于Mcrcsip.Web版本Y [或更糟糕的是,取决于依赖于Mcrcsip.Web版本Y的库]。要找到这些,可能很困难且乏味。

请参阅推荐的解决方案以跳到最后。

怎么样

当出现这种不一致时


您有一个依赖项,例如A依赖于B和C,B依赖于C,
A和B最初是针对C ver 1构建的
A根据C ver 2进行了更新和构建


与我们的直觉期望相反,在构建A时B不会自动魔术地更新为使用C ver2。A和B都必须引用同一个库才能正确构建。因此,要么A必须符合C ver 1,要么必须重新构建B并符合C ver 2。

现在,这可以在任何项目配置中发生,这就是为什么对软件进行版本控制很重要的原因[相信我,如果没有正确的签名\版本转换,此问题会变得更糟],并且每当发生依赖项更新时在团队中进行良好的沟通。

值得一提的是,有两种依赖关系引用:硬引用和软引用[实际上,它们是相同的,即指向dll的链接,除了一种是另一种的特殊情况,从概念上讲,它有助于区分两种]。

硬参考

硬引用是项目对静态dll的依赖。也就是说,依赖项是在特定时间生成的,除非将其物理文件替换为新的依赖项,否则它将永远不会更新。硬引用通过“添加引用”对话框添加到解决方案中,并通过.Net,COM或“浏览”选项卡添加引用。硬引用通常用于添加对当前解决方案范围之外开发的软件的依赖项(即框架,第三方和其他内部团队开发的其他第一方产品)。硬引用也趋于过时,因为它们是由自己的开发流进行维护和更新的。

假设以上情况


您有一个依赖项,例如A依赖于B和C,B依赖于C,
A和B最初是针对C ver 1构建的
A根据C ver 2进行了更新和构建


此外,假设A和B在同一个解内


简单解决方案


一个


B [硬参考]
C v2 [硬参考]




C v1 [硬参考]




构建A后,您将收到描述的错误。 A期望从C v2获得一个对象,但是由于B对C v1具有严格的依赖性,因此C v1首先被加载到内存中,并且发生冲突。 A期望v2并找到v1。那是你的错误。

要解决这种情况,您必须


将项目B硬引用C v1更新为C v2
强制重建项目B
将项目A的硬引用B更新为[新建] B
强制重建A


软参考

软引用是一个项目对同一解决方案中另一个项目的依赖。也就是说,每次重新构建整个解决方案时都会重新构建依赖项。通过“添加引用”对话框,并从“项目”选项卡添加引用,可以将软引用添加到解决方案中。软引用通常用于添加对当前解决方案范围内开发的软件的依赖关系,它们的主要优点是可以在同一解决方案中对消费者进行更改时传播更改。因此,软引用不会过时。

[这是硬引用的特殊情况,Visual Studio将添加一个指向目标项目的输出路径的引用,我相信如果目标项目更改其输出配置,它也会更新此路径-但它非常方便权证区别]

假设以上情况


您有一个依赖项,例如A依赖于B和C,B依赖于C,
A和B最初是针对C ver 1构建的
A根据C ver 2进行了更新和构建


此外,假设A和B在同一个解内


简单解决方案


一个


B [软参考]
C v2 [硬参考]




C v1 [硬参考]




构建A后,您将收到描述的错误。 A期望从C v2获得一个对象,但是由于B对C v1具有严格的依赖性,因此C v1首先被加载到内存中,并且发生冲突。 A期望v2并找到v1。那是你的错误。

解决,


将项目B硬引用C v1更新为C v2
强制重建A


如您所见,软引用更易于维护。

IL DASM [中级语言歧义]

现在,您对参考和项目维护有了更多的了解,那么如何确定构建状态呢?毕竟,您的任何一个项目或其依赖项都可能不一致。

最简单的方法是打开生成输出目录,并检查解决方案生成的每个dll的程序集清单。

要检查程序集的清单,


打开ildasm.exe


对于VS2010,ildasm可通过快捷方式获得
对于VS2008和VS2005,打开Visual Studio命令提示符,从命令行键入“ ildasm”

打开一个dll,


单击文件->打开,或
按Ctrl-O或
将您的dll拖放到ildasm窗口中

打开清单


双击标记为MANIFEST的红色三角形节点

查找对Mcrcsip.Web的引用


单击查找,然后在对话框中输入Mcrcsip.Web,或
按Alt-F并在对话框中输入Mcrcsip.Web,或
手动检查清单文件的内容

验证版本号


这是单调乏味且痛苦的事情,但是如果遇到[非平凡的] dll不一致错误,这是找到它的唯一方法。

推荐方案


确保您的解决方案在适用的情况下使用软引用,


展开Mcrcsip.Amwa.CrFactory


扩展参考
删除引用Mcrcsip.Amwa.Core
打开“添加引用”对话框
从“项目”选项卡中打开Mcrcsip.Amwa.Core

展开Mcrcsip.Amwa.PdfFormHandler


扩展参考
删除引用Mcrcsip.Amwa.Core
打开“添加引用”对话框
从“项目”选项卡中打开Mcrcsip.Amwa.Core

展开Mcrcsip.Amwa.Web


扩展参考
删除引用Mcrcsip.Amwa.Core
删除引用Mcrcsip.Amwa.CrFactory
删除引用Mcrcsip.Amwa.PdfFormHandler
打开“添加引用”对话框
从“项目”选项卡中打开Mcrcsip.Amwa.Core
从“项目”选项卡中打开Mcrcsip.Amwa.CrFactory
从“项目”选项卡中打开Mcrcsip.Amwa.PdfFormHandler


确保您的解决方案在适用的情况下使用最新的硬性参考,


展开Mcrcsip.Amwa.Core


扩展参考
删除参考Mcrcsip.Aws.Bol
删除参考Mcrcsip.Common
删除参考Mcrcsip.Web
打开“添加引用”对话框
从“浏览”选项卡中打开Mcrcsip.Aws.Bol [始终最好指定位置]
从“浏览”选项卡中打开Mcrcsip.Common
从“浏览”选项卡中打开Mcrcsip.Web

展开Mcrcsip.Amwa.CrFactory


扩展参考
删除参考Mcrcsip.Web
打开“添加引用”对话框
从“浏览”选项卡中打开Mcrcsip.Web

展开Mcrcsip.Amwa.PdfFormHandler


扩展参考
删除参考Mcrcsip.Web
打开“添加引用”对话框
从“浏览”选项卡中打开Mcrcsip.Web

展开Mcrcsip.Amwa.Web


扩展参考
删除参考Mcrcsip.Aws.Bol
删除参考Mcrcsip.Common
删除引用Mcrcsip.SharePoint
删除参考Mcrcsip.Web
打开“添加引用”对话框
从“浏览”选项卡中打开Mcrcsip.Aws.Bol
从“浏览”选项卡中打开Mcrcsip.Common
从“浏览”选项卡中打开Mcrcsip.SharePoint
从“浏览”选项卡中打开Mcrcsip.Web


建立


如果您在这一步仍然遇到错误,则说明其中一个或全部


麦考斯证券
麦卡西普
Mcrcsip.SharePoint


与您共享对Mcrcsip.Web的依赖关系,并且正在引用旧版本。如果是这样,那么对于上面列出的每个硬参考


选择一个参考
按F4
从Path属性复制内容
ildasm中打开文件对话框
粘贴到文件名
检查清单


确保对以上三个硬参考中的每一个都执行此操作。一旦确定了这三个中的哪个子集引用了Mcrcsip.Web的旧版本,您现在可能会找到该项目,更新其硬引用,重新构建,然后最终更新您的硬引用,重新构建和更新。鲍勃是你的叔叔。

ew

乐芬

PS为冗长而道歉。这不是一个非常复杂的问题,但是我相信您会同意的,它涉及很多细节。我真的希望这会有所帮助。也感谢您的合作:)

PPS顺便说一句,我从您的评论中推断出原始开发人员到处都使用了硬引用(即,即使在同一解决方案中)。也许他有他的原因,但是imo,那是屁股。

关于.net - .NET程序集引用对我来说是一个循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2381931/

相关文章:

c# - 如何在struct中初始化char数组

c# - 将十进制值格式化为带前导空格的字符串

visual-studio - 是否有用于选项卡式多显示器支持的 Visual Studio 2010 附加组件

visual-studio - SharePoint 2013 自定义登录页面?

reference - 如何在gradle中导出可执行jar,并且这个jar可以运行,因为它包含引用库

c# - 存储库应该通过构造函数注入(inject)还是包装在使用中?

函数外的 Javascript 导致未捕获的引用异常

c# - 调试 C# 存储字节数组 - byte[32] 特定字节在内存中或仅在内联代码中,如何保留以进行测试

javascript - 复制数组会产生奇怪的结果 ('copying' ==引用)

objective-c - Objective-C 运行时是否会为用户释放保留的关联引用?