如何调试/修复“公共语言运行时检测到无效程序”错误?到底是什么意思?
我有一个C#MVC 2 Web应用程序,可以部署到位于同一IIS 7.5 Web服务器(x64)上的两个网站。一个是实时站点(使用Release配置部署),第二个是beta站点(使用为此项目创建的新Beta配置部署)。
这两个网站是:
Default Website/my_app
Beta/my_app
在测试网站上选择分页的采购订单列表时,会抛出“检测到无效程序”异常。在现场网站上运行完全相同的代码完美无缺。为什么要这样做?
编辑:我在服务器上安装了Visual Studio,发现导致问题的实际行和堆栈跟踪:
var list = ObjectContext.ObjectSet.AsQueryable();
int totalRecords = list.Count();
var paged = list.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);
这是带有堆栈跟踪的异常消息:
{System.InvalidProgramException: Common Language Runtime detected an invalid program.
at System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479BFE9FA60F4C53137C56C1A1B2A11D90FF5AFFDC20383CC68E0A750792E3.set_Total(Decimal )
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at MyApp.Controllers.PurchaseOrderController.GetPurchaseOrderList(Int32 page, Int32 rows, String sidx, String sord) in C:\src\MyApp.2010\MyApp.UI\Controllers\PurchaseOrder\List.cs:line 11}
这个新信息准确显示问题所在,但不是问题所在。希望能够很好地了解实体框架的人能够阐明这一点:
System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479B_etc.set_Total(Decimal )
是发生错误的行。现在我在sql management studio中运行查询,结果不是null,而Total也不是null。那为什么调用set_Total()会有问题?
这是POCO定义总计字段(由T4模板生成)的方式:
[Decimal] [Required] [DisplayName("Total")]
public virtual decimal Total
{
get;set;
}
实时和测试版网站之间的主要区别在于构建配置。但是这两种配置都将每个项目设置为“任何CPU”。
我们所有的开发机器和服务器都是64位。导致此问题的网站的IIS配置之间是否存在某些差异?
我已经尝试过运行PEVerify - 但它只是说“所有类和方法已经验证”。 PEVerify如何帮助解决这类问题?
BTW我可以看到标题中有“共同语言运行时检测到无效程序问题”的大约15个问题。我的问题不是重复,并且有几个独特的功能与具有相似标题的其他问题不同(这15个中只有一个是关于实体框架的 - 其余的是关于反射或TFS)
答案 0 :(得分:19)
今天我遇到了这个问题,当时我将一个实现linq的web应用程序部署到我们的QA环境中。该问题原来是Windows 2008 R2服务器上的IIS设置。在应用程序池的“高级设置”下,“启用32位应用程序”的设置设置为“False”。我将它设置为True,现在我的应用程序就像在开发服务器上工作一样,它恰好是Windows 2003服务器。我希望这会有所帮助。
答案 1 :(得分:2)
对我来说,这是在我向实体模型添加视图时发生的。默认情况下,设计器将所有列Entity Key属性设置为true。当我为所有十进制/数字列设置为false时,错误消失。塔斯
答案 2 :(得分:1)
您是否尝试在其他计算机上部署beta配置?您的apppool设置是否相同(即经典与集成,相同的.net版本)?您是否尝试过清理解决方案并重新部署到新位置?您是否尝试将beta版部署到发布位置? (确保在发布之前删除所有文件;我很好奇,如果剩余的动态加载依赖项可能导致问题)
更新:
优秀的更多信息。在第3行,您正在定义变量页面,同时还使用先前定义的名为page的变量。怎么编译?尝试评论该代码或至少尝试不跳过。
注意:我认为Count()后跟Take()可能会执行两次查询。
注意2:我只使用了EntityFramework v4 Database First开发,但我不记得直接针对ObjectSet进行编程。通常它是你的实体类(例如,MyContext.Orders)......也许正在对该对象进行编程并设置Decimal值。该属性的模型是否有任何属性使其不标准?
答案 3 :(得分:0)
有一个主要的错误!!,我认为它是在Entity框架中具有十进制字段列属性,
我遇到了这个讨厌的错误消息,我比较了从2个独立的表(相同的表)获取数据,一个具有整数列ID,另一个具有十进制列ID,
对于带有整数列的表,没问题相同的代码运行完美, 对于带有十进制列的表,会弹出此错误消息 我已经对sql server iis和环境进行了检查,我甚至想格式化电脑, 它非常奇怪,错误消息不清楚。
希望这种方法有助于将来面临这样的错误。