为遗留库创建代码契约

2024-02-12

最终目标是为驻留在我无法控制的外部程序集中的类指定契约(即我不能直接向该类添加契约)。

到目前为止我已经尝试过:

  1. ContractClassFor属性。
    不起作用,因为目标类必须指向合约类。

  2. 通过对自动生成的程序集进行逆向工程,手动构建合同引用程序集(即 MyAsm.Contracts.dll)。
    不起作用,因为在我编译它之后,重写器就会启动并方便地剥离ContractDeclarativeAssembly属性,这使得工具无法将程序集识别为“合同引用程序集”。我找不到关闭重写器的方法。

  3. 创建一个与目标程序集具有相同名称、版本、强名称(如果有)和其他属性的“假”程序集,并在其中放置具有相同名称方法的同名类。然后在打开“构建契约引用”选项的情况下编译该程序集,然后获取生成的契约引用程序集并使用它。
    由于某种原因,这也不起作用,尽管我不知道到底是什么原因。静态检查器只是忽略我的 smartypants 生成的参考程序集,就好像它不存在一样。

还有一件事,以防万一:目标程序集是为 .NET 2.0 编译的,我无法为 4.0 重新编译它。

Update

编写一个具有定义契约的“包装”库是毫无疑问的。

其一,需要编写大量额外代码。但即使您将其放在一边,这也可能是一个重大的性能损失:我必须(可能)为每个用作“遗留”方法的返回类型的“遗留”类型创建包装器类。但即便如此,故事还没有结束。想象一下,某些方法可能返回对基接口的引用,然后调用代码可能会将它们转换为派生接口,以查看该对象是否支持更多功能。我该如何包裹它们?我可能必须提供定制Cast<T>()我的包装类上的方法,它将尝试强制转换底层类/接口,并在成功时返回结果的包装器。最后,我的整个代码库将变得如此复杂,以至于可能不值得。

另一方面,CC 团队本身已经成功解决了这个问题:他们确实为 mscorlib、System.Core 和其他一些系统程序集提供了正确的合同引用程序集,不是吗?他们是如何建造它们的?如果他们能做到,那么我看不出有什么理由我不能完成同样的把戏。

哦,好吧,实际上,我确实看到了一个原因:我不知道该怎么做。 :-) – Fyodor Soikin 18 秒前编辑


您可能已经快完成 (2) 了。请务必关闭您手动构建的 C# 程序集的契约重写。关闭所有运行时检查和静态分析,重写器不应启动。将其放在所有其他 CodeContracts 程序集所在的位置,例如对于 /bin/X.dll,创建一个转到 /bin/CodeContracts/X.Contracts.dll 的程序集。

See http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/5fe7ad4e-d4f1-4bb5-806e-a1e31f550181 http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/5fe7ad4e-d4f1-4bb5-806e-a1e31f550181。你是对的——只需通过查看 Reflector 创建所有正确的位即可。我想这样做是为了将契约添加到我的 F# 程序集中,直到 F# 可以处理契约。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为遗留库创建代码契约 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c

随机推荐