移动代码后TFS SDK程序集错误

时间:2012-08-16 16:53:41

标签: asp.net tfs2010

我们最近为我们的ASP.NET网站解决方案进行了一些代码重组,并且我遇到了TFS 2010 SDK程序集的一个不友好的问题,这是我无法弄清楚的。

我们有一个小类(我在下面包含了使用TFS SDK的函数),它检索自我们上次部署网站以来的所有TFS变更集注释。该网站项目具有以下使用TFS SDK的参考:

  • Microsoft.TeamFoundation.Client
  • Microsoft.TeamFoundation.VersionControl.Client

该类曾经存在于项目的App_Code文件夹中,并且以下TFS程序集部署在该站点的bin文件夹中:

  • Microsoft.TeamFoundation.Client.dll
  • Microsoft.TeamFoundation.Common.dll
  • Microsoft.TeamFoundation.Common.Library.dll
  • Microsoft.TeamFoundation.dll
  • Microsoft.TeamFoundation.VersionControl.Client.dll
  • Microsoft.TeamFoundation.VersionControl.Common.dll

这在部署到网站时没有错误地正常工作。

我们将此类(以及其他几个)移动到一个单独的类库中,并将其从站点的App_Code文件夹中删除,在Visual Studio中为项目更改所有适当的程序集引用。现在,当它部署时,我们在网站上点击的任何页面上都会出现以下错误:

  

无法加载文件或程序集'Microsoft.TeamFoundation.WorkItemTracking.Client.Cache,Version = 10.2.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。试图加载格式不正确的程序。

我可以从我的localhost和开发工作区运行而没有任何问题,所以构建的东西似乎不对。在检查了TFS抽出的构建之后,TFS SDK的构建中还包含了三个以前不存在的程序集:

  • Microsoft.TeamFoundation.WorkItemTracking.Client.Cache.dll
  • Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.dll
  • Microsoft.TeamFoundation.WorkItemTracking.Client.RuleEngine.dll

我无法弄清楚为什么现在将它们拉入构建中。我们不会在任何项目中直接引用这些程序集。从TFS中提取注释的代码没有改变,只是它的装配位置。没有执行TFS升级。底线 - 我们添加了一个类库,其中代码现在存在,并且它似乎需要一些它在App_Code文件夹中存在之前不需要的其他程序集。我最好的猜测是TFS在构建过程中将其作为依赖程序集中的其他程序集,但我不确定原因。

在线点击类似的错误通常围绕32/64位问题。我检查了Config Manager,解决方案中的所有项目都设置为使用Any CPU,这对我来说是正确的,我们在服务器上的IIS中启用了32位应用程序。

我对这篇文章的篇幅感到抱歉,但我想提供我认为的相关细节。任何想法将不胜感激。感谢。

Public Function GetChangesSinceDeployDate(ByVal lastDeployDate As DateTime) As List(Of TFSChange)

    Dim tfs As New TfsTeamProjectCollection(New Uri("http://tfs.proviadoor.com:8080/tfs/entrylink"))
    tfs.EnsureAuthenticated()

    Dim vcs As VersionControlServer = CType(tfs.GetService(GetType(VersionControlServer)), VersionControlServer)

    Dim versionFrom As VersionSpec = GetDateVSpec(lastDeployDate)
    Dim versionTo As VersionSpec = GetDateVSpec(Now)

    _changeList = New List(Of TFSChange)

    Dim changeSetIds As String = ""
    For Each projectPath As String In _projectPaths
        Dim results As IEnumerable = vcs.QueryHistory(projectPath, VersionSpec.Latest, 0, RecursionType.Full, "", versionFrom, versionTo, Integer.MaxValue, False, True)

        For Each chgSet As Changeset In results
            If Not chgSet.ChangesetId.ToString().InList(changeSetIds) Then
                _changeList.Add(New TFSChange(chgSet.ChangesetId, chgSet.Committer, chgSet.CreationDate, chgSet.Comment))
                changeSetIds.Append(chgSet.ChangesetId.ToString(), ",")
            End If
        Next
    Next

    Dim sortedList = From chg As TFSChange In _changeList _
                     Select chg _
                     Order By chg.CommitUser, chg.ChangeDate Descending

    Return sortedList.ToList()

End Function

Private Function GetDateVSpec(ByVal versionDate As DateTime) As VersionSpec

    Dim dateSpec As String = String.Format("D{0:yyy}-{0:MM}-{0:dd}T{0:HH}:{0:mm}", versionDate)
    Return VersionSpec.ParseSingleSpec(dateSpec, "")

End Function

1 个答案:

答案 0 :(得分:0)

消息“格式不正确的程序”确实表明存在32/64位问题。

问题是“任何CPU”代码都会以最高位启动它:在你的情况下,64位,因为在启动时引用的所有assmemblies都是64位(或者至少是任何CPU) )。

.NET中的惰性程序集加载/ JIT的某种组合意味着在您按下方法调用之前,实际上并未加载TFS程序集。到目前为止,您的应用程序已经承诺以64位运行,因此加载32位TFS程序集失败 - 您无法在一个进程中混合使用bit-ness。 在IIS中允许 32位应用程序是不够的:您必须通过更改编译设置来确保您的应用程序确实运行为32位。在这种情况下,“任何CPU”实际上是罪魁祸首,因为它允许您的代码以64位的形式启动。

我说“某种组合”因为我不确定具体细节,但我在控制台应用程序中看到了完全相同的问题,编译为Any CPU并引用了TFS DLL。解决方案是将入口点程序集编译为32位。如果在Web服务中使用了相同的代码,我们最终会出现一个单独的进程,以便Web应用程序也不会减少到32位。