DLL版本不匹配?

时间:2011-07-18 19:49:56

标签: c# .net dll z3

我正在尝试将Z3 SMT solver用于我的项目。然而,似乎Visual Studio版本不匹配,这引起了我的麻烦。我的Visual Studio 2008报告了

  

找不到引用的组件“Microsoft.Z3”。

虽然它确实在安装目录中(C:\ Program Files \ Microsoft Research \ Z3-2.19 \ bin)。

编译项目时,另一个警告说

  

已解决的文件图像质量不佳,没有元数据,或者是其他方式   无法访问。无法加载文件或程序集'C:\ Program   Files \ Microsoft Research \ Z3-2.19 \ bin \ Microsoft.Z3.dll'或其中一个   依赖。此程序集由比运行时更新的运行时构建   当前加载的运行时并且无法加载。

以及其他错误,表示找不到与Z3相关的类型为Context,Term等。

这是因为Z3的新版本是使用我没有的更新版本的dotNet Framework编译的吗?我该如何解决这个问题?提前谢谢!

PS:我在测试中使用的文件来自Z3 tutorial (pdf),第5章,粘贴在下面。

using System;
using Microsoft.Z3;

class Program
{
    Context ctx;
    Term mk_int(int a) { return ctx.MkIntNumeral(a); }
    Term mk_var(string name) { return ctx.MkConst(name, ctx.MkIntSort()); }
    Term mk_lo(Term x) { return x >= mk_int(0); }
    Term mk_mid(Term x, Term y, int a) { return y >= (x + mk_int(a)); }
    Term mk_hi(Term y, int b) { return (y + mk_int(b)) <= mk_int(8); }

    Term mk_precedence(Term x, Term y, int a, int b)
    {
        return ctx.MkAnd(new Term[] { mk_lo(x), mk_mid(x, y, a), mk_hi(y, b) });
    }

    Term mk_resource(Term x, Term y, int a, int b)
    {
        return (x >= (y + mk_int(a))) | (y >= (x + mk_int(b)));
    }

    void encode()
    {
        using (Config cfg = new Config())
        {
            cfg.SetParamValue("MODEL", "true");
            using (Context ctx = new Context(cfg))
            {
                this.ctx = ctx;
                Term t11 = mk_var("t11");
                Term t12 = mk_var("t12");
                Term t21 = mk_var("t21");
                Term t22 = mk_var("t22");
                Term t31 = mk_var("t31");
                Term t32 = mk_var("t32");
                ctx.AssertCnstr(mk_precedence(t11, t12, 2, 1));
                ctx.AssertCnstr(mk_precedence(t21, t22, 3, 1));
                ctx.AssertCnstr(mk_precedence(t31, t32, 2, 3));
                ctx.AssertCnstr(mk_resource(t11, t21, 3, 2));
                ctx.AssertCnstr(mk_resource(t11, t31, 2, 2));
                ctx.AssertCnstr(mk_resource(t21, t31, 2, 3));
                ctx.AssertCnstr(mk_resource(t12, t22, 2, 3));
                ctx.AssertCnstr(mk_resource(t12, t32, 3, 1));
                ctx.AssertCnstr(mk_resource(t22, t32, 3, 1));
                Model m = null;
                LBool r = ctx.CheckAndGetModel(out m);
                if (m != null)
                {
                    m.Display(System.Console.Out);
                    m.Dispose();
                }
            }
        }
    }

    static void Main()
    {
        Program p = new Program();
        p.encode();
    }
};

更新:在对旧的.msi安装程序文件进行一些提取后,我发现使用小于v4的dotNet Framework的Z3的最新版本是Z3 2.11;在这种情况下我决定使用,而不是暂时更新我的​​VS2008。

1 个答案:

答案 0 :(得分:1)

这可能是因为您的目标是比Z3库更老的.NET Framework。例如,如果您的Z3版本以.NET 4为目标,请确保在Visual Studio 2010中构建它并以.NET Framework 4.0为目标。