using System;
using System.Collections.Generic;
using Microsoft.Boogie;
public class Trace
{
public static void Main(string[] args)
{
if (args.Length != 2){
return;
}
Program program = new Program();
List<string> defines = new List<string>();
Parser.Parse(args[0], defines, out program);
string[] lines = System.IO.File.ReadAllLines(args[1]);
Dictionary< Block, List<Block> > adj = new Dictionary< Block, List<Block> >();
foreach (Declaration D in program.TopLevelDeclarations){
Implementation I = D as Implementation;
if(I != null){
foreach (Block B in I.Blocks){
object cmd = B.TransferCmd;
if(cmd is GotoCmd){
List<Block> target = cmd.labelTargets;
adj.insert(B, target);
}
else if(cmd is ReturnCmd){
adj.insert(B, null);
}
}
}
}
}
}
我是C#的新手,我不知道如何迭代program.TopLevelDeclarations
。
尝试迭代一个简单的列表,但是当我尝试包含Microsoft Boogie库时,编译器会抛出一些错误。
我正在使用以下命令在Ubuntu 13.04上使用gmcs
编译我的程序:
gmcs -r:../../boogie/Binaries/Boogie.exe -r:../../boogie/Binaries/Core.dll Trace.cs
其中包含以下错误:
在汇编/home/boogie/Binaries/Core.dll中缺少方法.ctor,键入System.Diagnostics.Contracts.ContractClassAttribute
无法找到自定义attr构造函数图像:/home/boogie/Binaries/Core.dll mtoken:0x0a000463
Trace.cs(19,52):错误CS0584:内部编译器错误:无法从程序集
System.Diagnostics.Contracts.ContractClassAttribute
加载类型Core
。Trace.cs(19,36):错误CS0266:无法将类型
object
隐式转换为System.Collections.Generic.List<Microsoft.Boogie.Declaration>
。存在显式转换(您是否缺少演员?)- 导入类型
Trace.cs(22,30):错误CS0584:内部编译器错误:无法从
Microsoft.Boogie.Implementation
Core, Version=2.2.30705.1126, Culture=neutral, PublicKeyToken=736440c9b414ea16
Trace.cs(22,30):错误CS0266:无法将类型
object
隐式转换为bool
。存在显式转换(您是否缺少演员?)- 导入类型
Trace.cs(23,55):错误CS0584:内部编译器错误:无法从
Microsoft.Boogie.Implementation
Core, Version=2.2.30705.1126, Culture=neutral, PublicKeyToken=736440c9b414ea16
Trace.cs(23,33):错误CS1579:foreach语句无法对
object
类型的变量进行操作,因为它不包含GetEnumerator
的定义或无法访问编译失败:6个错误,0个警告
有谁知道如何解决这个问题?我不正确地包括库吗?
答案 0 :(得分:3)
我似乎无法找到Microsoft.Boogie.Declaration
的来源,但鉴于错误消息,它具有[ContractClass]
属性,编译器无法找到该属性:
Trace.cs(19,52):错误CS0584:内部编译器错误:无法加载类型&#39; System.Diagnostics.Contracts.ContractClassAttribute&#39;来自汇编&#39;核心&#39;。
因此,无法加载Microsoft.Boogie.Declaration
类型,导致List<Declaration>
的{{1}}显然是&#34;存根&#34;某种program.TopLevelDeclarations
。这反过来导致您的代码失败,因为您无法迭代对象。
{4}已添加到.NET 4中的object
。您正在使用mscorlib
,根据ContractClassAttribute
编译.NET 2.0。
我认为最好使用gmcs
进行编译,这是推荐的。