Неожиданный персонаж

После перехода с VS2013 на VS2017 у меня неожиданная проблема с персонажем.

Все прекрасно работает в msbuild 12.0 и VS2013, но при переходе на 15.0 я получаю сотни:

CS1519 Неверный токен '?' в объявлении класса, структуры или интерфейса

в командной строке msbuild.

Здание внутри VS2017 возвращает:

CS1056 Неожиданный персонаж ''

var businessRuleData = principal.GetBusinessRule(​
BusinessRuleEnum.CONTENT_REPOSITORY);

Ошибка происходит в Ch66, который (B между этой областью. Персонаж, который скрыт, становится ? в комп. Однако, как уже упоминалось, тот же код прекрасно работает в msbuild 12.0. Удаление всего кода и повторная загрузка формы TFS не решили проблему

Код решения

Примечание: Поиск по коду для change_me и убедитесь, что вы изменили на любой желаемый товар.

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

namespace FixZeroWidthSpace
{
    class Program
    {
        static void Main(string[] args)
        {
            // change to your directory
            var files = Directory.GetFiles(@"D:\change_me", "*.cs", SearchOption.AllDirectories);
            var counter = 0;
            var counterEdited = 0;
            var totalFiles = files.Length;
            var failed = new List<string>();
            var found = new List<string>();
            TfsTeamProjectCollection tpc = null;
            Workspace ws = null;

            foreach (var file in files)
            {
                if(counter % 10 == 0)
                {
                    Console.WriteLine("Searched {0} or {1} files, {2} have been edited.", counter, totalFiles, counterEdited);
                }
                // change to any folders you want to ignore or remove if none
                if (!file.Contains("change_me_ignore_folder_name"))
                {
                    string text = File.ReadAllText(file);
                    var regex = new Regex("[\u200B-\u200D\uFEFF]");
                    var newText = regex.Replace(text, "");

                    if (text != newText)
                    {
                        try
                        {
                            if (ws == null || tpc == null)
                            {
                                // change to your TFS server
                                tpc = new TfsTeamProjectCollection(new Uri(@"http://change_me_your_tfs_url/tfs/DefaultCollection"));
                                ws = FindWorkspaceByPath(tpc, file);
                            }

                            FileAttributes attributes = File.GetAttributes(file);

                            if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                            {
                                attributes = RemoveAttribute(attributes, FileAttributes.Hidden);
                                File.SetAttributes(file, attributes);
                            }

                            ws.PendEdit(file);

                            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                            {
                                // Make the file RW
                                attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly);
                                File.SetAttributes(file, attributes);
                            }

                            File.WriteAllText(file, newText);
                            found.Add(file);
                            counterEdited++;
                        }
                        catch(Exception ex)
                        {
                            failed.Add(file);
                        }
                    }
                }
                counter++;
            }

            tpc.Dispose();
            File.WriteAllLines(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\found.txt", found);
            File.WriteAllLines(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\failed.txt", failed);

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static FileAttributes RemoveAttribute(FileAttributes attributes, FileAttributes attributesToRemove)
        {
            return attributes & ~attributesToRemove;
        }

        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;
                    }
                }
            }
            if (workspaces.Length > 0)
            {
                return workspaces[0];
            }

            throw new Exception(String.Format("TFS Workspace cannot be determined for {0}.", workspacePath));
        }
    }
}

1 ответ

Недавно я обнаружил, что это происходит в одном из моих решений. В моем коде ничего нет.

Если я сделаю чистое решение (щелкните правой кнопкой мыши на решении -> Чистое решение), проблема исчезнет.

Решение

Удалите все недопустимые символы, поскольку MSBuild 15.0 и VS2017 являются более строгими для этих символов Юникода.

Следующий код может быть использован для выполнения удаления всего кода в папке, которая является проблемой. Я использовал это, поскольку требуемые изменения были слишком большими, чтобы их можно было сделать вручную.


Код C#

переменные

[Вставить папку для сканирования]: пример C: \ TFS \ Code \ Branch \ Folder
[Вставить папку для игнорирования]: пример 3rdPartyCode

Код

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

namespace FixZeroWidthSpace
{
    class Program
    {
        static void Main(string[] args)
        {
            var files = Directory.GetFiles(@"D:\TFS\210-219\212\MCET_212", "*.cs", SearchOption.AllDirectories);
            var counter = 0;
            var counterEdited = 0;
            var totalFiles = files.Length;
            var failed = new List<string>();
            var found = new List<string>();

            foreach (var file in files)
            {
                if(counter % 10 == 0)
                {
                    Console.WriteLine("Searched {0} or {1} files, {2} have been edited.", counter, totalFiles, counterEdited);
                }
                if (!file.Contains("[Insert Folder To Ignore]"))
                {
                    string text = File.ReadAllText(file);
                    var regex = new Regex("[\u200B-\u200D\uFEFF]");
                    var newText = regex.Replace(text, "");

                    if (text != newText)
                    {
                        try
                        {
                            FileAttributes attributes = File.GetAttributes(file);

                            if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                            {
                                attributes = RemoveAttribute(attributes, FileAttributes.Hidden);
                                File.SetAttributes(file, attributes);
                            }

                            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                            {
                                // Make the file RW
                                attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly);
                                File.SetAttributes(file, attributes);
                            }

                            File.WriteAllText(file, newText);
                            found.Add(file);
                            counterEdited++;
                        }
                        catch(Exception ex)
                        {
                            failed.Add(file);
                        }
                    }
                }
                counter++;
            }

            File.WriteAllLines(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\found.txt", found);
            File.WriteAllLines(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\failed.txt", failed);

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static FileAttributes RemoveAttribute(FileAttributes attributes, FileAttributes attributesToRemove)
        {
            return attributes & ~attributesToRemove;
        }
    }
}

Код C# с TFS Checkout

переменные

[Вставить папку для сканирования]: пример C: \ TFS \ Code \ Branch \ Folder
[Вставить папку для игнорирования]: пример 3rdPartyCode
[Вставить URI в коллекцию серверов TFS]: пример http://tfs.company.com:8080/tfs/DefaultCollection

Код

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

namespace FixZeroWidthSpace
{
    class Program
    {
        static void Main(string[] args)
        {
            var files = Directory.GetFiles(@"[Insert Folder to Scan]", "*.cs", SearchOption.AllDirectories);
            var counter = 0;
            var counterEdited = 0;
            var totalFiles = files.Length;
            var failed = new List<string>();
            var found = new List<string>();
            TfsTeamProjectCollection tpc = null;
            Workspace ws = null;



            foreach (var file in files)
            {
                if(counter % 10 == 0)
                {
                    Console.WriteLine("Searched {0} or {1} files, {2} have been edited.", counter, totalFiles, counterEdited);
                }
                if (!file.Contains("3rdparty"))
                {
                    string text = File.ReadAllText(file);
                    var regex = new Regex("[\u200B-\u200D\uFEFF]");
                    var newText = regex.Replace(text, "");

                    if (text != newText)
                    {
                        try
                        {
                            if (ws == null || tpc == null)
                            {
                                tpc = new TfsTeamProjectCollection(new Uri(@"[Insert URI to TFS Server Collection]"));
                                ws = FindWorkspaceByPath(tpc, file);
                            }

                            FileAttributes attributes = File.GetAttributes(file);

                            if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                            {
                                attributes = RemoveAttribute(attributes, FileAttributes.Hidden);
                                File.SetAttributes(file, attributes);
                            }

                            ws.PendEdit(file);

                            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                            {
                                // Make the file RW
                                attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly);
                                File.SetAttributes(file, attributes);
                            }

                            File.WriteAllText(file, newText);
                            found.Add(file);
                            counterEdited++;
                        }
                        catch(Exception ex)
                        {
                            failed.Add(file);
                        }
                    }
                }
                counter++;
            }

            tpc.Dispose();
            File.WriteAllLines(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\found.txt", found);
            File.WriteAllLines(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\failed.txt", failed);

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static FileAttributes RemoveAttribute(FileAttributes attributes, FileAttributes attributesToRemove)
        {
            return attributes & ~attributesToRemove;
        }

        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));
        }
    }
}
Другие вопросы по тегам