1

誰でも助けてください!以下のコードを実行しようとすると、次のエラーが発生しました。

" ファイルまたはアセンブリ 'Microsoft.Z3, Version=4.0.0.0, Culture=neutral, PublicKeyToken=9c8d792caae602a2' またはその依存関係の 1 つを読み込めませんでした。不適切な形式のプログラムを読み込もうとしました "

コードは次のとおりです。

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();
        }

    }
}

}

4

2 に答える 2

1

この質問に対する以前の回答へのコメントでは、x86 ディストリビューションと x64 ディストリビューションへの言及がありましたが、この問題が解決されたかどうかはわかりません。明確にするために:

64 ビット バイナリ (Visual Studio では x64 と呼ばれます) をコンパイルする場合、z3.dll と Microsoft.Z3.dll の 64 ビット バージョンが必要です。これらは、Z3 ディストリビューションのx64というフォルダーにあります。これは、Visual Studio が実行されている実際のマシンには依存しないことに注意してください。

32 ビット バイナリをコンパイルする場合、binディレクトリの dll が必要です。繰り返しますが、これはVisual Studio が実行されている実際のマシンには依存しません。

Visual Studio は 32 ビットから 64 ビットへ、またはその逆にクロスコンパイルできます。つまり、32 ビット アーキテクチャ用のバイナリをコンパイルできます ( x64ではなくx86と呼ばれます)。) 64 ビット マシン上。32 ビット マシンで 64 ビット バイナリをコンパイルすることもできます。コンパイルするバイナリの種類に応じて、適切な dll セットを追加する必要があります。重要な設定は、Visual Studio のプロジェクトのビルド構成にあります (上部、通常はデバッグ/リリース モードが選択されている場所の横)。このコンパイル段階では、コンパイルが実行されているマシンのタイプは関係ありません。実際のマシンが問題になるのは、32 ビット マシンで 64 ビット バイナリを実行しようとした場合のみです (ただし、エラー メッセージは報告されたものとは異なります)。64 ビット マシンで 32 ビット バイナリを実行すると、通常は正常に動作します (ただし、プログラムの最大メモリ使用量は制限されます)。

これが混乱の一部を取り除くのに役立つことを願っています!

また、両方のバージョンを含むディストリビューションを組み合わせることで不必要な混乱が生じることに同意するため、将来的には 32 ビットと 64 ビットのバイナリ用に個別のインストーラーを配布することを検討します。

于 2012-06-27T18:35:13.893 に答える
1

最も簡単な方法は、フォルダ内のbuild.cmdスクリプトを使用examples/dotnetし、必要に応じて変更することです。スクリプトは、Microsoft.Z3.dllおよびz3.dllを作業ディレクトリにコピーし、対応するプラットフォームでコードをコンパイルします。

Visual Studio からコンパイルする場合:

  • Microsoft.Z3.dll参照する のバージョンが、コンパイル先のプラットフォーム (x86、x64、...) と一致することを確認してください。binandフォルダには 2 つの Z3 バージョンがありx64ます。
  • を含むフォルダーをMicrosoft.Z3.dllProject Properties -> Reference Pathsに含めます。その理由は、Visual Studio で直接参照できないMicrosoft.Z3.dllunmanaged を使用しているためです。z3.dll
于 2012-06-21T11:45:10.187 に答える