任何人都可以帮忙! 当我尝试运行下面的代码时,我收到了这个错误:
“无法加载文件或程序集”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();
}
}
}
}
答案 0 :(得分:1)
最简单的方法是在build.cmd
文件夹中使用examples/dotnet
脚本,并根据需要进行修改。该脚本将Microsoft.Z3.dll
和z3.dll
复制到工作目录,并在相应的平台上编译代码。
如果从Visual Studio编译:
Microsoft.Z3.dll
版本与您正在编译的平台(x86,x64,...)匹配。 bin
和x64
文件夹中有两个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位二进制文件分配单独的安装程序。