我正在尝试在大型桌面应用程序项目中使用与.NET 3.5的代码契约,该项目还具有混合模式C ++ DLL依赖项,使用旧的托管C ++语法编写。
真正的解决方案包括至少20个项目,但我们假设只有A,B,C和D项目,以及混合模式M项目。 C依赖于A,B和M.A,B和C都配置为执行运行时检查,并且代码重写效果很好。现在我想将一些合同添加到一个更高级别的程序集中,称为D.D依赖于所有其他程序集,A,B,C和M.现在代码重写失败了D,并带有以下消息(我已经更改了名称):
15> Reading assembly 'C' from 'build\debug\C.dll' resulted in errors.
15> ccrewrite : error : Rewrite aborted due to metadata errors. Check output window
15> Input string was not in a correct format.
15> Malformed signature.
15> Index was outside the bounds of the array.
15> Malformed signature.
15> Could not resolve type reference: [M]Name.Space.Class1.
15> Could not resolve type reference: [M].EnumType.
15> Malformed signature.
15> Malformed signature.
15> Could not resolve type reference: [M]Name.Space.Class1.
15> Could not resolve type reference: [M].EnumType.
15> Malformed signature.
15> Malformed signature.
15> Input string was not in a correct format.
15> Malformed signature.
15> Could not resolve type reference: [M]Name.Space.Class1.
15> Could not resolve type reference: [M].EnumType.
15> Malformed signature.
15> Malformed signature.
15> Index was outside the bounds of the array.
15> Malformed signature.
因为有关M的消息,我认为问题出在混合模式C ++ DLL上。但是C汇编本身可以成功地进行代码重写,同时它也引用了M。
我也认为这个问题并不直接存在于D程序集中,因为我已经在同一个解决方案中尝试了其他更高级别的程序集,如果它们引用C,它们就不能被代码契约工具重写。
我使用的版本是1.2.21023.14
我在CodeContracts MSDN论坛上也问过这个问题,但还没有收到任何答案,所以我想我会在这里试试。我对与此相关的任何解决方法或想法感兴趣。
答案 0 :(得分:3)
要清除元数据错误,通常只需清理解决方案,然后重新构建它。