本地构建v TFSBuild问题......任何想法?

时间:2012-06-14 13:25:20

标签: wcf dynamic tfs2010 tfsbuild

我有一个公开两个服务的WCF项目。当我在本地构建服务时,它工作正常。当TFS Build创建程序集时,其中一个服务不起作用。在调用服务之前,客户端应用程序抛出“索引超出数组范围”异常。

我们正在使用TFS2010来对抗迁移的基于MSBuild的项目,而不是新的工作流程。

我可以从我的机器上用版本构建版本替换TFS构建的DLL,并且服务开始工作。我可以将TFS内置版本的DLL放在我的机器上,我的本地服务开始失败。

我检查过的事情:

  • 所有项目都设置为构建Release |任何CPU
  • 两台机器都安装了VS2010 SP1
  • 反汇编这两个DLL显示它们包含相同的代码

有点担心:我的机器是Windows 7 x64,构建机器是Windows Server 2003 x86。但是,我认为任何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...

3 个答案:

答案 0 :(得分:5)

感谢您的建议......所有伟大的想法。

我发现我的问题更加微妙。该组件正在利用动力学。如果您使用它来调用具有公共基类型的类的方法,那么动态有一个鲜为人知的错误,其中基类型在不同的程序集中。动态实现查找要调用的方法的方式使用MetadataToken来识别方法,但是这并不保证在组件中是唯一的,因此动态可能会混淆并且可能尝试调用不同的方法,可能具有不同的数量参数,因此是IndexOutOfRangeException!

已报告并已修复但尚未提供:

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

我仍然不确定为什么DLL的一个版本工作而另一个版本没有。但是由于没有使用通用的基类,问题就消失了。

答案 1 :(得分:0)

您可以检查的一些事项:

  • 您是否正在使用任何预编译器,如ngen,它会根据机器的CPU编译代码?
  • 您使用的是第三方图书馆吗?
  • Windows 2003上的IIS上的应用程序池设置是什么,相对于64位?
  • 两台机器的.net框架的补丁级别是否相同

答案 2 :(得分:0)

在我参与的大型网络项目之前,我遇到过这个问题,实在令人沮丧。在Visual Studio中构建的行为有时与使用MSBuild直接构建不同。有x86和x64版本的MSBuild,它们可以以不同的方式工作。请参阅以下文章: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-bit-msbuild.aspx

希望有所帮助:)