如何在使用Mono编译时引用Microsoft.Boogie?

时间:2013-12-08 12:17:15

标签: c# mono

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个警告

有谁知道如何解决这个问题?我不正确地包括库吗?

1 个答案:

答案 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进行编译,这是推荐的。