2011-07-13 117 views
7

「共通言語ランタイムが無効なプログラムを検出しました」というエラーをどのようにデバッグ/修正しますか?とにかくそれはどういう意味ですか?C#Entity Framework 4共通言語ランタイムが無効なプログラムエラーを検出しましたか?

同じIIS 7.5 Webサーバー(x64)に存在する2つのWebサイトに展開できるC#MVC 2 Webアプリケーションがあります。 1つはライブサイト(リリース構成を使用して展開)、2番目はベータサイト(このプロジェクト用に作成された新しいベータ設定を使用して展開)です。

2つのウェブサイトは、以下のとおりです。

ベータサイトで
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} 

この新しい情報は、どこに問題があるのか​​を正確に示していますが、問題の内容は示していません。 Entityフレームワークをよく知っている人であれば、このことを明らかにすることができます。

System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479B_etc.set_Total(Decimal) 

エラーが発生する行はありますか?今私は、SQLの管理スタジオでクエリを実行し、結果はnullではなかった、合計もnullではありませんでした。なぜset_Total()を呼び出すのに問題があったのですか?

[Decimal] [Required] [DisplayName("Total")] 
public virtual decimal Total 
{ 
    get;set; 
} 

ライブとベータサイトの主な違いは、ビルド構成です:

この

はPOCOは(T4テンプレートによって生成された)合計フィールドを定義する方法です。しかし、両方の設定では、すべての単一プロジェクトが「任意のCPU」に設定されています。

私たちの開発マシンとサーバーはすべて64ビットです。これを引き起こしているWebサイトのIIS構成にはいくつかの違いがありますか?

私はPEVerifyを実行しようとしましたが、 "すべてのクラスとメソッドの検証済み"と表示されています。この種の問題にPEVerifyがどのように役立つのですか?

私はタイトルに「Common Language Runtimeが無効なプログラムの問題を検出しました」という15の質問があることがわかります。私の質問は重複しておらず、似たようなタイトルを持つ他の質問とは異なるいくつかのユニークな機能を持っています(これらの15のうちの1つだけがEntity Frameworkについてです - 残りはReflectionまたはTFSに関するものです)

+0

Visual Studio 2010では、さまざまなリリースモードで異なるweb.configファイルがサポートされています。ベータ版とプロダクション設定ファイルが機能的に同一であることを確認しましたか? –

+0

はい、唯一の違いはデータベース接続文字列です。リリースとベータ版の両方で同じ基本web.configを使用してから、web deployを実行して正しい接続文字列を追加します。 –

+0

これを解決しようとするために+100の賞金が追加されました –

答えて

19

今日私は、QA環境にエンティティ4へのlinqを実装しているWebアプリケーションを配備したときにこの問題に遭遇しました。この問題は、Windows 2008 R2サーバー上のIIS設定であることが判明しました。アプリケーションプールの[詳細設定]で、[32ビットアプリケーションを有効にする]の設定が[偽]に設定されました。私はそれをTrueに設定しました。そして、私のアプリケーションは、Windows 2003サーバであった開発サーバと同じように動作します。私はこれが役立つことを願っています

+0

+1優れた点検と問題を修正したように見える!今私のプロジェクトのすべてが任意のCPUとしてコンパイルされている場合、正確に32ビットとして実行しようとしているものは? Entity Framework自体が32ビットとして動作しようとしていますか?私は完全にそれをテストする必要がありますが、賞金があなたの方法を行っているように見えます:) –

+0

ありがとう。私は確かにそれを感謝します。私はこの1つを追跡して半日を過ごしました。 – Rick

+0

あなたはあなたです。 :)多くの日以来それに取り組んでいます:) –

1

ベータ設定を別のマシンに展開しようとしましたか?アプリの設定は同じですか(つまり、従来のバージョンと同じ、同じ.netバージョン)。ソリューションのクリーニングを試みて、新しい場所に再デプロイしましたか?ベータ版を展開して場所を公開しようとしましたか? (公開する前にすべてのファイルを削除してください。好奇心旺盛イム場合theresの問題を引き起こしている可能性があります残り動的にロードされた依存関係)

UPDATE:

優れたWRTの詳細。3行目では、以前に定義した変数pageを使用して変数ページを定義しています。それはどうやってコンパイルされますか?そのコードをコメントアウトするか、少なくともスキップしないで試してみてください。

注:Take()に続いてCount()がクエリを2回実行している可能性があります。

注2:EntityFramework v4 Database First開発のみを使用しましたが、ObjectSetに対して直接プログラミングすることは覚えていません。通常は、あなたのエンティティクラス(MyContext.Ordersなど)です...おそらく、そのオブジェクトに対してプログラミングを行い、Decimal値を設定することがあります。そのプロパティのモデルに非標準的なプロパティがありますか?

+0

アプリケーションプールは同じですが、私はきれいにして再構築し、複数回展開してから展開する前にファイルを削除しています。これは、すべてのプロジェクトを任意のCPUとして展開するように設定したので、ビルドに関連してはならない場合に発生します。 Entity Frameworkでおそらく何か? –

+0

が質問をより詳細に更新しました。 Visual Studioをサーバーにインストールし、問題の原因となっていた実際の行とスタックトレースを見つけました。 –

+0

oops - 改行3はtypoであり、 'paged'を読むべきです - もう一つのvarは' int page'です。これは検索するページの番号です。私はカウントがダブルクエリを実行した場合に取るかどうかをチェックします。 –

0

主要なバグがある!!、私は、エンティティフレームワークの中で10進数フィールドの列プロパティを持ちながら、それがあると思い、

私はこの厄介なエラーMSGに直面している、私は2つの別々のテーブル(同じテーブル)からデータを取得比較整数列IDを持つものと小数点の列IDを持つもの、

整数列のテーブルでは、同じコードが完全に実行されていません。 小数点以下の列の表の場合は、このエラーメッセージが表示されます SQL Serverのiisと環境のチェックを行いました。私はさらにPCをフォーマットしたかったので、 非常に奇妙で、エラーmsgはクリアされていませんar。

このアプローチは、今後このようなエラーに直面するのに役立ちます。

2

これは、私のエンティティモデルにビューを追加したときに起こりました。既定では、デザイナはEntity Keyプロパティのすべての列をtrueに設定します。すべての10進数/数値列に対してfalseに設定すると、エラーはなくなります。 Tas

+0

これはあなたに感謝しました! – Jazaret

関連する問題