Это зависит от версии вашего TFS. Тем не менее, если вы пытаетесь подключиться к TFS2015 или TFS2017, это подойдет:
using Microsoft.TeamFoundation.Client;
using Microsoft.VisualStudio.Services.Common;
using System;
using System.Net;
namespace TFSConsoleApp
{
class Program
{
static void Main(string[] args)
{
NetworkCredential networkCredentials = new NetworkCredential(@"Domain\Account", @"Password");
Microsoft.VisualStudio.Services.Common.WindowsCredential windowsCredentials = new Microsoft.VisualStudio.Services.Common.WindowsCredential(networkCredentials);
VssCredentials basicCredentials = new VssCredentials(windowsCredentials);
TfsTeamProjectCollection tfsColl = new TfsTeamProjectCollection(
new Uri("http://XXX:8080/tfs/DefaultCollection"),
basicCredentials);
tfsColl.Authenticate(); // make sure it is authenticate
}
}
}
Я не могу не подчеркнуть, что с учетными данными все в порядке! Эта ошибка встречалась и у меня пару раз.
Есть и другое решение, если вышеперечисленное не работает.
Черт возьми я должен был думать некоторое время для этого - я сделал изрядное количество небольшого COM, программирующего с ATL, и редко должен был использовать его.
Существует одна ситуация, хотя это приходит на ум: расширения Windows Shell. Если Вы имеете дело с рядом объектов файловой системы, что Вам, возможно, придется иметь дело с PIDLs (указатель на идентификационный список). Это причудливые небольшие абстракции объекта файловой системы, и они должны быть явно выделены/освобождены с помощью COM-осведомленного средства выделения такой как CoTaskMemAlloc
. Существует также альтернатива, IMalloc
указатель на интерфейс, полученный из SHGetMalloc
(удержанный от использования) или CoGetMalloc
- это - просто уровень абстракции для использования, так, чтобы код не был связан с определенным средством выделения памяти и мог использовать, любой адаптирует тот.
Точка использования CoTaskMemAlloc
или IMalloc
вместо malloc()
это, выделение памяти / освобождение должно быть чем-то, что "COM-знает" так, чтобы его выделение и освобождение последовательно выполнялись во времени выполнения, даже если выделение и освобождение сделаны абсолютно несвязанным кодом (например, Windows выделяет память, передачи это к Вашему коду C++, который позже освобождает, или Ваш код C++ выделяет, передачи это к чужому коду VB, который позже освобождает). Ни один malloc()
ни new
способны к взаимодействию с "кучей" системы во время выполнения, таким образом, Вы не можете использовать их для выделения памяти, чтобы передать другим COM-объектам, или получить память от других COM-объектов и освободить.
CoTaskMemAlloc - то же как malloc за исключением того, что прежний используется для выделения памяти, которая используется через границы процесса.
т.е. если мы имеем два процесса, process1 и process2, предполагаем, что process1 является сервером COM, и process2 является COM-клиент, который использует интерфейсы, выставленные process1. Если process1 должен отправить некоторые данные, то он может выделить использование памяти CoTaskMemAlloc для выделения памяти и копирует данные. К той ячейке памяти может получить доступ process2.
Библиотека COM автоматически делает маршалинг и немаршалинг.
Эта статья MSDN сравнивает несколько различных средств выделения, выставленных Win32, включая CoTaskMemAlloc. Это главным образом используется в COM, программирующем - наиболее конкретно, когда реализация сервера COM должна выделить память для возврата назад к клиенту. Если Вы не пишете сервер COM, то Вы, вероятно, не должны использовать его.
(Однако при вызове кода, который выделяет использование памяти CoTaskMemAlloc и возвращает его назад Вам, необходимо будет освободить возвращенное использование выделения (выделений) CoTaskMemFree.)