如何解决使用Microsoft Solver Foundation时的System.TypeLoadException异常
问题:Microsoft Solver Foundation在.NET 6.0中运行报错TypeLoadException
我有一项大学作业,需要使用Microsoft Solver Foundation(可通过Visual Studio的NuGet获取)求解线性规划(LP)。以下是我的代码:
using System; using Microsoft.SolverFoundation; using Microsoft.SolverFoundation.Common; using Microsoft.SolverFoundation.Services; SolverContext context = SolverContext.GetContext(); Model model = context.CreateModel(); Decision potato = new Decision(Domain.RealNonnegative, "ingredient_potato"); Decision meat = new Decision(Domain.RealNonnegative, "ingredient_meat"); Decision vegetable = new Decision(Domain.RealNonnegative, "ingredient_vegetable"); model.AddDecisions(potato, meat, vegetable); model.AddConstraint("calorie", 800 * potato + 1000 * meat + 5 * vegetable == 600); model.AddConstraint("protein", 150 <= 5 * potato + 500 * meat <= 250); model.AddConstraint("vitamin", 10 * potato + 100 * vegetable >= 200); model.AddGoal("price", GoalKind.Minimize, 5 * potato + 20 * meat + 7 * vegetable); Solution solution = context.Solve(new SimplexDirective()); Console.Write(solution.GetReport());
在.NET 6.0环境下运行时,遇到如下错误:
System.TypeLoadException: 'Could not load type 'System.Runtime.Remoting.Messaging.CallContext' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.'
原因分析
Microsoft Solver Foundation是较老的类库,依赖.NET Framework专属的System.Runtime.Remoting.Messaging.CallContext类型,而该类型在.NET Core/.NET 5及以上版本(包括.NET 6)中已被移除,因此触发类型加载失败的异常。
解决方案
- 切换目标框架到.NET Framework:将项目目标框架改为.NET Framework 4.x(推荐4.6.1及以上),Microsoft Solver Foundation原生支持该框架,切换后代码可正常运行。操作步骤:Visual Studio中右键项目→属性→应用程序→目标框架,选择对应.NET Framework版本。
- 保留.NET 6的替代方案:使用兼容.NET 6的线性规划库,比如
MathNet.Numerics或Google.OrTools,这些库原生支持现代.NET平台,可替代Microsoft Solver Foundation完成线性规划求解。
内容的提问来源于stack exchange,提问作者Jord van Eldik
相关产品推荐
相关产品推荐

