【问题标题】:Does HyperDescriptor work when built in .NET 4?HyperDescriptor 在 .NET 4 中构建时可以工作吗?
【发布时间】:2011-03-07 13:16:39
【问题描述】:

我正在开发一个 .NET 4 项目,并且可以从 HyperDescriptor 提供的动态属性访问中受益,但是在 .NET 4 中构建时它似乎无法正常工作。我下载了源代码来自 CodeProject,将解决方案项目转换为 VS2010,并将目标框架更新为 4.0。当它构建并且示例正确执行时,时间显示使用 HyperDescriptor 访问动态属性是获取/设置对象值的最慢可能的方式。

仅当您使用 .NET 4 从源代码构建 HyperDescriptor 时才会出现此问题。如果从您的 .NET 4 项目中添加对使用 .NET 2 构建的 HyperDescriptor 的引用,它可以正常工作。目前这是一个可以接受的解决方案,但使用 .NET 4 构建会有一些潜在优势吗?任何人都想尝试一下 HyperDescriptor,看看为什么 .NET 4 构建这么慢?

【问题讨论】:

  • 哦。有趣的。如果没有解决,明天再看看。

标签: c# .net dynamic clr4.0


【解决方案1】:

我下载了源代码并使用 .NET 4 运行了测试。有大量的 InvalidOperationException 被抛出和捕获,导致运行缓慢。

转到HyperTypeDescriptionProvider.BuildDescriptor 并替换:

[ReflectionPermission(SecurityAction.Assert, Flags = ReflectionPermissionFlag.AllFlags)]

作者:

[SecuritySafeCritical]
[ReflectionPermission(SecurityAction.Assert, Unrestricted = true)]

AllFlags 已弃用,只会导致警告,但从安全透明方法断言在 .NET 4 中无效。有关详细信息,请参阅 Security Changes in the .NET Framework 4

【讨论】:

  • 完美运行,时间再次超快。谢谢!
  • 嗨@julien,我尝试在.net 4.5.2 中编译项目,但出现以下错误。 Deny 堆栈修饰符已被 .NET Framework 废弃。有什么解决办法吗?谢谢。
  • 另外,当我将版本更改为 v4.0 时,我在 static void Main() { // 验证事情是否正常,无需反射访问 new ReflectionPermission(ReflectionPermissionFlag.AllFlags).Deny( );出现错误拒绝堆栈修饰符已被 .NET Framework 废弃。
  • 当我将版本更改为 4.5.2 时,出现上述错误。然后我评论它并运行代码,它执行得很好。但随后输出文件为空白。即使使用 4.0,输出文件也是空白的。我继续使用 dll 并尝试将 List 转换为数据表。但桌子是空的。当我调试时,我下面的属性是空白的。 PropertyDescriptorCollection 属性 = TypeDescriptor.GetProperties(typeof(T));感谢您在这方面的任何帮助。目标是使其与 .net 4.5.2 一起使用。提前致谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2011-09-01
  • 2015-02-05
相关资源
最近更新 更多