2011-07-18 241 views
1

我想爲我的項目使用Z3 SMT solver。但是,它似乎有一個Visual Studio版本的不匹配,這導致了我的麻煩。我的Visual Studio 2008報告不匹配的DLL版本?

無法找到引用的組件'Microsoft.Z3'。

雖然它的確在安裝目錄(C:\ Program Files \ Microsoft Research \ Z3-2.19 \ bin)。

當項目被編譯,另一個警告說

解決文件有一個不好的形象,沒有元數據,或以其他方式 無法訪問。無法加載文件或程序集「C:\ Program Files \ Microsoft Research \ Z3-2.19 \ bin \ Microsoft.Z3.dll」或其某個 依賴項。此程序集由比當前加載的運行時更新的運行時構建,並且無法加載。

以及其他錯誤說沒有找到Z3相關類型作爲上下文,術語等。

這是因爲新版本的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(); 
    } 
}; 

UPDATE:舊.msi安裝文件的幾個萃取後,我發現最新版本Z3的,它使用的dotNet框架小於V4是Z3 2.11;在這種情況下,我決定使用,而不是現在更新我的VS2008。

+0

你不是之前問過這個嗎? –

回答

1

這很可能是因爲您定位的是比Z3庫更舊的.NET Framework。例如,如果您的Z3版本以.NET 4爲目標,請確保在Visual Studio 2010中構建這個版本,並將其定位到.NET Framework 4.0。

+0

感謝您的快速回復。我還有兩個問題。 1.我如何確保我得到的Z3 DLL確實來自VS2010;現在我只懷疑這是原因。 2.如果是這樣,VS2008中無法做到這一點?謝謝! –

+0

@Xiaopeng:我看到的唯一「問題」都與此有關。你應該下載VS 2010,並且瞄準.NET 4,它會解決你的問題。你還有什麼問題? –

+0

@Xiaopeng:通過Ildasm運行它(http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx) - 它會告訴你框架的版本。如果它的目標是.NET 4(我懷疑是這種情況),那麼您將需要VS 2010.您可以免費下載VS 2010 Express,網址爲:http://www.microsoft.com/express –