【问题标题】:Compilation errors with ImageResizer 3.2.1ImageResizer 3.2.1 的编译错误
【发布时间】:2012-06-14 23:22:21
【问题描述】:

在允许 Nuget 将 ImageResizer 3.1.5 更新到版本 3.2.1 后,我的编译失败并出现多个错误(所有相同类型):

Error 5 Missing compiler required member 'System.Runtime.CompilerServices.ExtensionAttribute..ctor'

显然这是程序集版本不匹配的结果。删除项目中的所有 ImageResizer 引用允许无错误编译。

恢复到 ImageResizer 3.1.5 也可以成功编译。

我的项目是一个针对 .NET4 的简单 MVC3 应用程序 - ImageResizer 3.1.5 和 3.2.1 都针对 v2.0.50727

关于如何解决此问题的任何想法?

感谢期待!

【问题讨论】:

  • 作者建议将带有此标签的查询发布到 StackOverflow ;)
  • 这很公平 :) 让我们希望他能做出回应。
  • 将 3.2.1 版添加到我的一个项目后,我遇到了同样的错误。在另一个项目中,错误消息是:预定义类型“System.Runtime.CompilerServices.ExtensionAttribute”在全局别名的多个程序集中定义;使用来自 'c:\MyProject\packages\ImageResizer.3.2.1\lib\ImageResizer.dll' 的定义。我刚刚卸载了软件包并手动下载了旧版本。我不明白,为什么作者在 NuGet 上发布标记为 Alpha 的 3.2.1 版本。
  • 我也暂时恢复到 3.1.5,效果很好——毕竟 ImageResizer 相当优秀的包。也许 Nuget 让更新到最新/最好的版本变得太容易了……这让我想起了我不断向我的手机刷新内核和 ROM 的疯狂瘾;)
  • 我在 NuGet 上发布了这个包,因为我认为它修复的错误比它可能引入的错误更重要。到目前为止,这个 bug 只影响了某些项目配置,并且有很多变通方法。

标签: imageresizer


【解决方案1】:

更新(2012 年 6 月 20 日):最佳解决方案 is for the project to roll back extension method support。 ImageResizer 3.2.2 将不再提供扩展方法,但一些功能将在 ResizeSettings 和 Instructions 类中重复,以尽量减少那些已经针对新 alpha API 进行编码的人的损坏。

ImageResizer V4 很可能需要 .NET 3.5,并将重新引入缺失的功能。


更新:please see this question instead,如果您对此 catch-22 有任何解决方案。

我为这些问题道歉。 我仍在尝试收集数据并找到长期解决方案,但这是我目前所拥有的:

解决方法 A:

在解决方案资源管理器中,展开项目中的 References 文件夹,选择 ImageResizer,然后转到 Properties。将 Aliases 字段从“global”更改为“ir”。

解决方法 B:

将您的项目设置为使用 .NET 2.0,保存,然后将其恢复为使用 .NET 3.5 或 .NET 4。

解决方法 C:

手动删除您的 System.Core 引用并添加正确的引用。 (通常的罪魁祸首是在 3.5 项目中使用 System.Core 3.0 引用的升级项目)。在 ASP.NET 上,您可以这样做in web.config

解决方法 D:

Revert to 3.2.0, but only if you're using C#.

为什么会这样

VisualStudio/MSBuild 在编译过程中在项目中找到System.Runtime.CompilerServices.ExtensionAttribute 的多个定义,但编译器没有选择System.Core 中定义的public 副本,而是决定使用internal 中定义的程序集本地副本ImageResizer.dll。然后它会抱怨,因为其他程序集无法访问它。无精打采。

应该发生什么

Microsoft has used this technique 过去几次都没有问题,并且它已被广泛记录。编译器应该选择公共实例以供项目范围使用,但它选择的是“内部”副本。这并没有影响到许多开发人员;只有少数人可以通过新项目重现它。

公共与内部

V2.3.0 将 ExtensionAttribute 定义为 public 而不是 internal。这会在 VB 项目中导致编译计时器错误,但在 C# 项目中不会。我立即发布了标记为internal 的 2.3.1,但我现在看到的是 C# 项目的问题。 Catch-22 在这里。

它适用于其他人...and Microsoft!为什么是我?

http://www.danielmoth.com/Blog/Using-Extension-Methods-In-Fx-20-Projects.aspx

http://www.codethinked.com/using-extension-methods-in-net-20

http://kohari.org/2008/04/04/extension-methods-in-net-20/

Using extension methods in .NET 2.0?

“黑客”是even featured in MSDN magazine

您如何提供帮助

我需要更多数据才能完全弄清楚这一点。如果您遇到问题,请将项目的 .zip 文件通过电子邮件发送至 support@imageresizing.net,并附上您的 VisualStudio/.NET 版本号(转到 Visual Studio、帮助、关于,然后单击 Copy Info,然后将其粘贴到电子邮件中)。

希望我能够找到引发问题的确切情况。

更新 - 刚刚找到 this article,这意味着唯一的解决方案是创建程序集的多个版本。但是Microsoft didn't!我错过了什么?此外,NuGet 不支持 2.0 和 3.5 版本控制,因此除非我能找到单一程序集解决方案,否则我可能不得不放弃 2.0 支持。

【讨论】:

  • 非常感谢您的及时回复。我已通过电子邮件向您发送了我的完整项目的存档,并将在今天下午尝试您的上述建议。
  • @Sean 刚从遇到类似问题的 IronPython 开发人员那里得到a conclusive answer on the linked page。扩展方法必须在 V3.2.2 中回滚。我找到了一种通过插入中间基类来最大限度地减少代码破坏的方法,但是充分利用所有扩展方法的人可能不得不更改代码。
  • 在线修补程序:downloads.imageresizing.net/…
  • 请将反馈发送至support@imageresizing.net,我想在几个小时内使用新版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多