2

2 つのサービスを公開する WCF プロジェクトがあります。サービスをローカルでビルドすると、正常に動作します。TFS ビルドがアセンブリを作成するときに、サービスの 1 つが機能しません。クライアント アプリケーションは、サービスが呼び出される前に、「インデックスが配列の範囲外でした」という例外をスローします。

新しいワークフロー プロセスではなく、移行された MSBuild ベースのプロジェクトに対して TFS2010 を使用しています。

TFS でビルドされた DLL をマシンのリリース ビルド バージョンに置き換えると、サービスが機能し始めます。TFS ビルド バージョンの DLL を自分のマシンに配置すると、ローカル サービスが失敗し始めます。

私がチェックしたこと:

  • すべてのプロジェクトはリリースをビルドするように設定されています | 任意の CPU
  • 両方のマシンに VS2010 SP1 がインストールされています
  • 2 つの DLL を逆アセンブルすると、同じコードが含まれていることがわかります

少し心配です。私のマシンは Windows 7 x64 で、ビルド マシンは Windows Server 2003 x86 です。ただし、Any CPU は、ビルド プロセス中にこれが問題にならないことを意味すると推測しました。

この問題を調査するための他のアプローチの提案はありますか?

クライアントからのスタック トレースには以下が含まれます。

System.ServiceModel.FaultException 1[System.ServiceModel.ExceptionDetail]: Index was outside the bounds of the array. (Fault Detail is equal to An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: System.IndexOutOfRangeException: Index was outside the bounds of the array. at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.GetMethodInfoFromExpr(EXPRMETHODINFO methinfo) at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.GenerateCall(EXPRCALL pExpr) at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.VisitCALL(EXPRCALL pExpr) at Microsoft.CSharp.RuntimeBinder.Semantics.ExprVisitorBase.Dispatch(EXPR pExpr) at Microsoft.CSharp.RuntimeBinder.Semantics.ExprVisitorBase.Visit(EXPR pExpr) at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.GenerateLambda(EXPRCALL pExpr) at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.VisitCALL(EXPRCALL pExpr) at Microsoft.CSharp.RuntimeBinder.Semantics.ExprVisitorBase.Dispatch(EXPR pExpr) at Microsoft.CSharp.RuntimeBinder.Semantics.ExprVisitorBase.Visit(EXPR pExpr) at Microsoft.CSharp.RuntimeBinder...

4

3 に答える 3

5

提案をありがとう...すべての素晴らしいアイデア。

私の問題はもっと微妙であることがわかりました。アセンブリはダイナミクスを利用していました。ベースタイプが別のアセンブリにある、共通のベースタイプを持つクラスのメソッドを呼び出すためにダイナミクスを使用する場合、ダイナミクスにはほとんど知られていないバグがあります。ダイナミクスの実装が呼び出すメソッドを探す方法では、MetadataTokenを使用してメソッドを識別しますが、これはアセンブリ全体で一意であることが保証されていないため、ダイナミクスが混乱し、別のメソッドを呼び出そうとする可能性があります。パラメータ、したがってIndexOutOfRangeException!

これは報告および修正されていますが、まだ利用できません。

https://connect.microsoft.com/VisualStudio/feedback/details/691494/issue-with-getmethodinfofromexpr

DLLの一方のバージョンが機能し、もう一方のバージョンが機能しなかった理由はまだわかりません。しかし、共通の基本クラスを使用しないことで、問題は解決しました。

于 2012-06-14T22:49:53.570 に答える
0

あなたがチェックできるいくつかのこと:

  • マシンの CPU に基づいてコードをコンパイルする ngen などのプリコンパイラを使用していますか?
  • サードパーティのライブラリを使用していますか?
  • 64 ビットに関して、Windows 2003 ボックスの IIS のアプリケーション プール設定は何ですか?
  • .net フレームワークのパッチ レベルは両方のマシンで同じですか
于 2012-06-14T16:01:12.190 に答える
0

以前、私が関わっていた大規模な Web プロジェクトでこの問題を経験したことがあり、本当にイライラしました。Visual Studio でビルドすると、MSBuild で直接ビルドする場合とは動作が異なる場合があります。MSBuild には x86 バージョンと x64 バージョンがあり、動作が異なります。次の記事を参照してください: http://blogs.msdn.com/b/msbuild/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx

また、ビルド マシンに .Net Framework と Visual Studio の最新バージョンとパッチがあることを確認することもできます。

これは、私が見つけた別の記事で、x64 MSBuild のその他の落とし穴をリストしています: http://blogs.msdn.com/b/visualstudio/archive/2010/05/07/building-on-cross-targeting-scenarios-and- 64 ビット msbuild.aspx

それが役立つことを願っています:)

于 2012-06-14T22:07:08.710 に答える