C#Entity Framework 4公共语言运行时检测到无效的程序错误?

JK.*_*JK. 8 c# linq asp.net-mvc clr entity-framework

如何调试/修复"公共语言运行时检测到无效程序"错误?究竟到底是什么意思?

我有一个C#MVC 2 Web应用程序,可以部署到位于同一IIS 7.5 Web服务器(x64)上的两个网站.一个是实时站点(使用Release配置部署),第二个是beta站点(使用仅为此项目创建的新Beta配置部署).

这两个网站是:

Default Website/my_app
Beta/my_app
Run Code Online (Sandbox Code Playgroud)

在测试网站上选择分页的采购订单时,它会抛出"检测到无效程序"异常.在现场网站上运行完全相同的代码完美无缺.它为什么要这样做?

编辑:我在服务器上安装了Visual Studio,并找到导致问题的实际行和堆栈跟踪:

var list = ObjectContext.ObjectSet.AsQueryable();
int totalRecords = list.Count();
var paged = list.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);
Run Code Online (Sandbox Code Playgroud)

这是带有堆栈跟踪的异常消息:

{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}
Run Code Online (Sandbox Code Playgroud)

这个新信息准确显示问题所在,但不是问题所在.希望能够很好地了解实体框架的人能够阐明这一点:

System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479B_etc.set_Total(Decimal )
Run Code Online (Sandbox Code Playgroud)

是发生错误的行.现在我在sql management studio中运行查询,结果不是null,而Total也不是null.那么为什么调用set_Total()会有问题呢?

这是POCO定义Total字段(由T4模板生成)的方式:

[Decimal] [Required] [DisplayName("Total")]
public virtual decimal Total
{
    get;set;
}
Run Code Online (Sandbox Code Playgroud)

live和beta站点之间的主要区别在于构建配置.但是这两种配置都将每个项目设置为"任何CPU".

我们所有的开发机器和服务器都是64位.引起这种情况的网站的IIS配置是否会有所不同?

我已经尝试过运行PEVerify - 但它只是说"所有类和方法已经验证".PEVerify如何帮助解决这类问题?

顺便说一句,我可以看到标题中有大约15个问题,"公共语言运行时检测到无效程序问题".我的问题不是重复的,并且有几个独特的功能与具有相似标题的其他问题不同(这15个中只有一个是关于实体框架的 - 其余的是关于Reflection或TFS)

小智 20

我今天遇到了这个问题,当时我将实施linq的web应用程序部署到我们的QA环境中.该问题原来是Windows 2008 R2服务器上的IIS设置.在应用程序池的"高级设置"下,"启用32位应用程序"的设置设置为"False".我将它设置为True,现在我的应用程序就像在开发服务器上工作一样,它恰好是Windows 2003服务器.我希望这有帮助.