私のチームの1人は、最近、マトリックスの興味深い欠点に遭遇しました。誰かがこれを説明するのを助けることができればそれはすばらしいだろう。それはおそらく説明するのは複雑なので、私と一緒にいてください。IIS7での奇妙な64/32ビットGUIDの問題
私たちはASP.Netアプリケーションを構築しています。その中には単純な「if」文があります。
Guid adminId = Guid.Empty;
if (mRoles.Contains("Admin"))
{
adminId = mUserId;
}
(mRolesが一覧で、「管理者」が含まれている場合)
これは(すなわちadminIdにはmUserIdが割り当てられている)期待と同じように動作します。ただし、以下の三項演算子を使用するように書き直された場合、それはありません! (adminIDにはGuid Emptyが割り当てられます)!
Guid adminId = mRoles.Contains("Admin") ? mUserId : Guid.Empty;
これは64ビットマシン(IIS7/64ビットVistaの場合)にあり、発見された開発者 ...次のように彼は「既定のアプリケーションプール」>「詳細の下にIISでの彼の設定を変更した場合設定 "チェック"有効にする32ビットアプリケーションを有効にする "今すぐ両方のステートメントが動作します!
これは、Guidがクラスではなく構造体であり、値が何らかの形で64ビットプロセスでオフセットされている可能性があると考えられます。なぜ最初の単純なif文の動作を説明するかもしれない http://www.mail-archive.com/[email protected]/msg00164.html 私は問題はこれに類似している疑いがある
...。 (adminId変数を作成するとポインターが作成される可能性がありますが、3進演算子は生成されません)
誰かがこれを踏まえれば、それは素晴らしいものになるでしょう。 互換性のバグですか?三項演算子と構造体を組み合わせることについての誤解?
ありがとうございました。
UPDATE
一緒に簡単なアプリケーションを入れて、完全に新しいプロジェクトでそれを再現することはできませんので、GUIDがより何か他のものでなければなりません。
//作品は
Guid adminId = true ? mUserId : Guid.Empty;
//動作しない(たとえトン==真!!!! ???)(adminIdにまでmUserIdを割り当て)
bool t = (mRoles.Contains("TenantAdmin");
Guid adminId = t ? mUserId : Guid.Empty;
私たちは」だと思いますこれで描画ボードに戻ります。あなたの助けをお寄せいただきありがとうございました。私たちが何かを得ることができれば、私はここに再び投稿します
多分あまり明確ではなかったのは、mRolesがタイプ文字列の汎用リストではないということだけでした。これは文字列[]であり、Contains()メソッドはLINQsの拡張メソッドです。違いがあれば、その理由は分かりません。
我々はIL見てきたし、それが正しい(そして今断続的に動作します!)UPDATE 2
は、私たちが発見したと、デフォルトのアプリケーションプールは、より多くのアプリケーションをロードするとき、それが再び失敗し始めていることです。私たちが考えることができる唯一の他のものは、これらの他のアプリケーションの中には、アプリケーションに何らかの形で干渉している管理されていないコードが含まれている可能性があるということです。
まったく新しいプロジェクトのいくつかの単純な行で動作を複製できますか? –
+1。完全に分散する – AnthonyWJones
コンパイル中に異なる設定が有効なときに生成されるILを比較します。 – AakashM