在C#中运行Z3时出现错误

时间:2012-06-21 10:37:38

标签: c# z3

任何人都可以帮忙! 当我尝试运行下面的代码时,我收到了这个错误:

  

“无法加载文件或程序集”Microsoft.Z3,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = 9c8d792caae602a2'或其中一个   依赖。尝试加载程序不正确   格式“

以下是代码:

class Program
{
    static void Main(string[] args)

    {

        using (Context ctx = new Context())
        {

            RealExpr c = ctx.MkRealConst("c");

            BoolExpr Eqzero = ctx.MkGt(c, ctx.MkReal(0));
            BoolExpr Gezero = ctx.MkGe(c, ctx.MkReal(0));
            BoolExpr Lttwo = ctx.MkLt(c, ctx.MkReal(2));
            BoolExpr Gtthree = ctx.MkGt(c, ctx.MkReal(3));
            BoolExpr b1 = ctx.MkBoolConst("b1");
            BoolExpr b2 = ctx.MkBoolConst("b2");
            BoolExpr b3 = ctx.MkBoolConst("b3");
            BoolExpr b0 = ctx.MkBoolConst("b0");
            RealExpr[] lamb = new RealExpr[1];
            lamb[0] = ctx.MkRealConst("lamb");
            BoolExpr temp = ctx.MkAnd(ctx.MkGt(lamb[0], ctx.MkReal(0)), ctx.MkEq(b0, ctx.MkTrue()), ctx.MkEq(b1, ctx.MkTrue()), ctx.MkGe(ctx.MkAdd(c, lamb[0]), ctx.MkReal(0)), ctx.MkLe(ctx.MkAdd(c, lamb[0]), ctx.MkReal(3)), ctx.MkGe(c, ctx.MkReal(0)), ctx.MkLe(c, ctx.MkReal(3)));
            BoolExpr exist = ctx.MkExists(lamb, temp, 1, null, null, ctx.MkSymbol("Q2"), ctx.MkSymbol("skid2"));
            Console.WriteLine(exist.ToString());
            Solver s1 = ctx.MkSolver();
            s1.Assert(exist);
            if (s1.Check() == Status.SATISFIABLE)
            {
                Console.WriteLine("get pre");
                Console.Write(s1);
            }
            else
            {
                Console.WriteLine("Not reach");
            }
            Console.ReadKey();
        }

    }
}

}

2 个答案:

答案 0 :(得分:1)

最简单的方法是在build.cmd文件夹中使用examples/dotnet脚本,并根据需要进行修改。该脚本将Microsoft.Z3.dllz3.dll复制到工作目录,并在相应的平台上编译代码。

如果从Visual Studio编译:

  • 确保您引用的Microsoft.Z3.dll版本与您正在编译的平台(x86,x64,...)匹配。 binx64文件夹中有两个Z3版本。
  • 项目属性 - > 参考路径中包含包含Microsoft.Z3.dll的文件夹。原因是Microsoft.Z3.dll使用了非托管z3.dll,您无法在Visual Studio中直接引用它。

答案 1 :(得分:1)

在对此问题的先前答案的评论中,提到了对x86发行版和x64发行版的引用,我不确定此问题是否已得到解决。澄清:

编译64位二进制文​​件(在visual studio中称为x64)时,需要64位版本的z3.dll和Microsoft.Z3.dll。这些可以在Z3发行版中名为 x64 的文件夹中找到。请注意,取决于运行Visual Studio的实际计算机。

编译32位二进制文​​件时,需要 bin 目录中的dll。同样,依赖于运行Visual Studio的实际计算机。

Visual Studio可以从32位交叉编译到64位,反之亦然,也就是说,可以为32位架构编译二进制文件(称为 x86 ,而不是 x64 )在64位计算机上。也可以在32位机器上编译64位二进制文​​件。根据正在编译的二进制类型,必须添加正确的dll集。重要的设置是在Visual Studio中项目的构建配置中(在顶部,通常在选择调试/发布模式的位置旁边)。在此编译阶段,正在执行编译的机器类型无关紧要。实际的机器只在尝试在32位机器上运行64位二进制文​​件时才会起作用(但是错误消息将与报告的错误消息不同)。在64位计算机上运行32位二进制文​​件通常可以正常工作(但程序的最大内存使用量将受到限制)。

我希望这有助于消除一些混乱!

此外,我们同意包含两个版本的组合分发会产生一些不必要的混淆,因此将来我们会考虑为32位和64位二进制文​​件分配单独的安装程序。

相关问题