C# TFS API:GetLocalWorkspaceInfo始终返回null

C# TFS API:GetLocalWorkspaceInfo始终返回null,c#,tfs-sdk,C#,Tfs Sdk,在我的一台机器上,我从任何GetLocalWorkspaceInfo调用中得到一个null的返回值。我已经将问题隔离到这个简单程序甚至失败的地方: namespace WorkstationTest { using Microsoft.TeamFoundation.VersionControl.Client; class Program { static void Main() { string workspace

在我的一台机器上,我从任何
GetLocalWorkspaceInfo
调用中得到一个null的返回值。我已经将问题隔离到这个简单程序甚至失败的地方:

namespace WorkstationTest
{
    using Microsoft.TeamFoundation.VersionControl.Client;

    class Program
    {
        static void Main()
        {
            string workspaceLocalPath = @"C:\Dev";
            var info = Workstation.Current
                          .GetLocalWorkspaceInfo(workspaceLocalPath);

            // info is always null here
        }
    }
}
我已经检查过的内容:

  • 完全相同的代码在我的另一台机器上按它应该的方式工作

  • 我已经验证了我在
    C:\Dev

  • 我在另一个目录中创建了一个新的工作区,并将代码中的
    workspaceLocalPath
    变量更改为匹配

  • 我已经查阅了一些说明,如果路径不在工作区中,则返回值将为null
    。从上图中,路径应该位于工作区中


然而,一切似乎都表明这应该奏效。有什么我可能遗漏的吗?

在Visual Studio 2010命令提示符中执行
tf workspace
(在我的计算机上)时,会显示
此计算机上找不到工作区匹配*
,但是,在Visual Studio 2012中执行相同的命令时,它会返回所有预期的工作空间

可以通过执行以下任一操作来解决此问题:

  • 请参考与Visual Studio 2012连接的
    Microsoft.TeamFoundation.VersionControl.Client
    dll的版本,而不是与Visual Studio 2010连接的dll

  • 打开VisualStudio2010并将其连接到TFS,以便为VisualStudio2010创建工作区


我知道这是一篇老文章,但我想分享我们的解决方法,使用VersionControlServer.QueryWorkspace为用户在其机器上查询所有工作空间

private static Workspace FindWorkspaceByPath(TfsTeamProjectCollection tfs, string workspacePath)
{ 
    VersionControlServer versionControl = tfs.GetService<VersionControlServer>();

    WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(workspacePath);

    if (workspaceInfo != null)
    {
        return versionControl.GetWorkspace(workspaceInfo);
    }

    // No Workspace found using method 1, try to query all workspaces the user has on this machine.
    Workspace[] workspaces = versionControl.QueryWorkspaces(null, Environment.UserName, Environment.MachineName);
    foreach (Workspace w in workspaces)
    {
        foreach (WorkingFolder f in w.Folders)
        {
            if (f.LocalItem.Equals(workspacePath))
            {
                return w;
            }
        }
    }

    throw new Exception(String.Format("TFS Workspace cannot be determined for {0}.", workspacePath));
}
私有静态工作区FindWorkspaceByPath(TfsTeamProjectCollection tfs,string workspacePath)
{ 
VersionControlServer versionControl=tfs.GetService();
WorkspaceInfo WorkspaceInfo=Workstation.Current.GetLocalWorkspaceInfo(workspacePath);
如果(工作空间信息!=null)
{
返回versionControl.GetWorkspace(workspaceInfo);
}
//使用方法1未找到工作区,请尝试查询用户在此计算机上的所有工作区。
Workspace[]workspaces=versionControl.QueryWorkspaces(null,Environment.UserName,Environment.MachineName);
foreach(工作空间中的工作空间w)
{
foreach(w文件夹中的工作文件夹f)
{
如果(f.LocalItem.Equals(工作空间路径))
{
返回w;
}
}
}
抛出新异常(String.Format(“无法为{0}确定TFS工作区,workspacePath));
}

在我的例子中,出现此问题是因为TFS缓存文件夹下的
VersionControl.config
文件(
C:\Users\DeepakR\AppData\Local\Microsoft\Team Foundation\5.0\cache\Volatile\0cb76a25-2556-4bd6-adaa-5e755ac07355\u http
)出现问题,即配置的工作区信息无法按预期提供

因此,它基本上需要刷新
VersionControl.config
文件。当Visual Studio再次加载时会自动刷新,即它从服务器提取配置的工作区信息并更新配置文件,或者即使我们执行tf命令实用程序(
tf.exe workspaces/collection:TFSURL

Microsoft.TeamFoundation.VersionControl.Client
的(v12.0.0.0)
Workstation
类有一个函数
EnsureUpdateWorkspaceInfoCache
,该函数将执行相同的操作

VersionControlServer vcs = (VersionControlServer)tpc.GetService(typeof(VersionControlServer));
Workstation.Current.EnsureUpdateWorkspaceInfoCache(vcs, Environment.UserName);


希望此建议有助于解决此问题。

这是当您有服务器路径时如何查找工作区:

  Workspace[] workspaces = _versionControl.QueryWorkspaces(null, Environment.UserName, Environment.MachineName);
  return workspaces.FirstOrDefault(w => !string.IsNullOrEmpty(w.TryGetLocalItemForServerItem(ConstDefaultFlowsTfsPath)));
其中
ConstDefaultFlowsTfsPath
是带有
“$”的服务器路径
,例如:
“$/MyCompany/Services/DiagnosticsFlows”

您还可以将最后一行替换为:

return workspaces.FirstOrDefault(w => !string.IsNullOrEmpty(w.GetServerItemForLocalItem(myLocalPath)));
这应该也适用于您。

我最近(今天)在使用Visual Studio 2017时遇到了这个问题,另外还安装了几个其他版本和一些本地工作区

<>我最后通过“管理NuGuePosits”菜单更新了“Team Foundation Server客户机”NuGET包到最新版本(<代码> 15×x/COD>),并修复了它。p>
我也确实先删除了现有的项目引用,但该部分可能取决于您的需要。

在我工作的公司从TFS2013迁移到TFS2017后,我在Workstation.Current.GetLocalWorkspaceInfo上遇到了相同的问题

对我起作用的是打电话给:

tfstreamprojectcollection tpc=tfstreamprojectcollectionfactory.GetTeamProjectCollection(新Uri(“”);
VersionControlServer tfServer=tpc.GetService();
Workstation.Current.EnsureUpdateWorkspaceInfoCache(tfServer、tfServer.AuthorizedUser);

我将上述代码行添加到使用GetLocalWorkspaceInfo的TFS代理类的构造函数中。

只需使用技巧运行即可

没有正确的DLL引用,任何东西都无法正常工作。下面的内容修复了我5天来遇到的同一个问题,因为它把我的时间搞砸了

将下面的DLL放在项目的bin文件夹中,并为所有DLL提供整个解决方案的参考。如果出现类似“无法提供引用”的任何错误,请忽略它并跳过该DLL,而不提供引用,只需将创建DLL的错误也放在bin文件夹中,项目将在生成过程中自动执行该文件夹

动态链接库:

如果系统安装了MTM或TFS,则可以在下面的路径中找到上述dll

路径:C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer

在我的
C:\Users\\AppData\Local\Microsoft\Team Foundation
文件夹中,我有两个文件夹:

  • 7.0

  • 8.0

在8.0文件夹中有以下文件夹:

\Cache\Volatile\c1dbda02-c575-4dd2-b221-e83f7cb63665_http
但是在7分钟之内。
Microsoft.TeamFoundation.Client.dll                                  
Microsoft.TeamFoundation.Common.dll                                   
Microsoft.TeamFoundation.Core.WebApi.dll                              
Microsoft.TeamFoundation.TestManagement.Client.dll                    
Microsoft.TeamFoundation.TestManagement.Common.dll                    
Microsoft.TeamFoundation.Work.WebApi.dll                              
Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll  
Microsoft.TeamFoundation.WorkItemTracking.Client.dll                  
Microsoft.TeamFoundation.WorkItemTracking.Common.dll                  
Microsoft.TeamFoundation.WorkItemTracking.Controls.dll                
Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll                   
Microsoft.TeamFoundation.WorkItemTracking.WebApi.dll                  
Microsoft.VisualStudio.Services.Client.Interactive.dll                
Microsoft.VisualStudio.Services.Common.dll                            
Microsoft.VisualStudio.Services.WebApi.dll                            
Microsoft.WITDataStore32.dll                                          
Microsoft.WITDataStore64.dll                                          
\Cache\Volatile\c1dbda02-c575-4dd2-b221-e83f7cb63665_http