C# 使用Mono编译时如何引用Microsoft.Boogie?
这会产生以下错误: 程序集/home/boogie/Binaries/Core.dll中缺少方法.ctor,类型为System.Diagnostics.Contracts.ContractClassAttribute 找不到自定义attr构造函数映像:/home/boogie/Binaries/Core.dll mtoken:0x0a000463C# 使用Mono编译时如何引用Microsoft.Boogie?,c#,mono,C#,Mono,这会产生以下错误: 程序集/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.
- Trace.cs(19,52):错误CS0584:内部编译器错误:无法从程序集
核心
加载类型
System.Diagnostics.Contracts.ContractClassAttribute
- Trace.cs(19,36):错误CS0266:无法将类型
隐式转换为对象
。存在显式转换(是否缺少强制转换?)System.Collections.Generic.List
- Trace.cs(22,30):错误CS0584:内部编译器错误:无法从
Core导入类型
,版本=2.2.30705.1126,区域性=中性,PublicKeyToken=736440c9b414ea16Microsoft.Boogie.Implementation
- Trace.cs(22,30):错误CS0266:无法将类型
隐式转换为对象
。存在显式转换(是否缺少强制转换?)bool
- Trace.cs(23,55):错误CS0584:内部编译器错误:无法从
Core导入类型
,版本=2.2.30705.1126,区域性=中性,PublicKeyToken=736440c9b414ea16Microsoft.Boogie.Implementation
- Trace.cs(23,33):错误CS1579:foreach语句无法对
对象类型的变量进行操作,因为它不包含
GetEnumerator的定义,或者不可访问
有人知道如何解决这个问题吗?我是否错误地包含了库?我似乎找不到
Microsoft.Boogie.Declaration
的源代码,但给出了错误消息,它有一个[ContractClass]
属性,编译器找不到:
Trace.cs(19,52):错误CS0584:内部编译器错误:无法从程序集“Core”加载类型“System.Diagnostics.Contracts.ContractClassAttribute”
因此,无法加载类型Microsoft.Boogie.Declaration
,导致program.TopLevelDeclarations
的列表
,显然是作为对象的某种“存根”。这反过来会导致代码失败,因为您无法在对象上迭代
已将添加到.NET 4中的mscorlib
。您使用的是gmcs
,根据.NET2.0编译而成
我认为您最好使用mcs编译,这是推荐的。您的机器上有库吗?您使用的是Mono框架吗?另外,如果你在Ubuntu上,你可以使用而不是手工编译,这将为你解决大部分问题
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);
}
}
}
}
}
}
gmcs -r:../../boogie/Binaries/Boogie.exe -r:../../boogie/Binaries/Core.dll Trace.cs