我们最近为我们的ASP.NET网站解决方案进行了一些代码重组,并且我遇到了TFS 2010 SDK程序集的一个不友好的问题,这是我无法弄清楚的。
我们有一个小类(我在下面包含了使用TFS SDK的函数),它检索自我们上次部署网站以来的所有TFS变更集注释。该网站项目具有以下使用TFS SDK的参考:
该类曾经存在于项目的App_Code文件夹中,并且以下TFS程序集部署在该站点的bin文件夹中:
这在部署到网站时没有错误地正常工作。
我们将此类(以及其他几个)移动到一个单独的类库中,并将其从站点的App_Code文件夹中删除,在Visual Studio中为项目更改所有适当的程序集引用。现在,当它部署时,我们在网站上点击的任何页面上都会出现以下错误:
无法加载文件或程序集'Microsoft.TeamFoundation.WorkItemTracking.Client.Cache,Version = 10.2.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。试图加载格式不正确的程序。
我可以从我的localhost和开发工作区运行而没有任何问题,所以构建的东西似乎不对。在检查了TFS抽出的构建之后,TFS SDK的构建中还包含了三个以前不存在的程序集:
我无法弄清楚为什么现在将它们拉入构建中。我们不会在任何项目中直接引用这些程序集。从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
答案 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位。