diff --git a/EncodingNormalior.sln b/EncodingNormalior.sln index 725ff87..5098645 100644 --- a/EncodingNormalior.sln +++ b/EncodingNormalior.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.26228.9 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EncodingNormalior", "EncodingNormalior\EncodingNormalior.csproj", "{B4D74A9C-F593-4DD9-9CE6-FF12259E6337}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EncodingNormalior", "EncodingNormalior\EncodingNormalior.csproj", "{B4D74A9C-F593-4DD9-9CE6-FF12259E6337}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EncodingNormalizerVsx", "EncodingNormalizerVsx\EncodingNormalizerVsx.csproj", "{5C4AABAC-646E-4CA0-822A-0A3D18A296C2}" EndProject @@ -13,32 +13,64 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EncodingUtf8AndGBKDifferent EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EncodingNormalior.WPF", "EncodingNormalior.WPF\EncodingNormalior.WPF.csproj", "{DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EncodingNormalizerVsix", "EncodingNormalizerVsix\EncodingNormalizerVsix.csproj", "{24B5AD6C-70C2-424D-B960-CD7513FA7695}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Debug|x86.ActiveCfg = Debug|Any CPU + {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Debug|x86.Build.0 = Debug|Any CPU {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Release|Any CPU.ActiveCfg = Release|Any CPU {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Release|Any CPU.Build.0 = Release|Any CPU + {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Release|x86.ActiveCfg = Release|Any CPU + {B4D74A9C-F593-4DD9-9CE6-FF12259E6337}.Release|x86.Build.0 = Release|Any CPU {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Debug|x86.ActiveCfg = Debug|Any CPU + {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Debug|x86.Build.0 = Debug|Any CPU {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Release|Any CPU.ActiveCfg = Release|Any CPU {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Release|Any CPU.Build.0 = Release|Any CPU + {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Release|x86.ActiveCfg = Release|Any CPU + {5C4AABAC-646E-4CA0-822A-0A3D18A296C2}.Release|x86.Build.0 = Release|Any CPU {388DB615-88E4-4306-B941-DC3C81B06194}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {388DB615-88E4-4306-B941-DC3C81B06194}.Debug|Any CPU.Build.0 = Debug|Any CPU + {388DB615-88E4-4306-B941-DC3C81B06194}.Debug|x86.ActiveCfg = Debug|Any CPU + {388DB615-88E4-4306-B941-DC3C81B06194}.Debug|x86.Build.0 = Debug|Any CPU {388DB615-88E4-4306-B941-DC3C81B06194}.Release|Any CPU.ActiveCfg = Release|Any CPU {388DB615-88E4-4306-B941-DC3C81B06194}.Release|Any CPU.Build.0 = Release|Any CPU + {388DB615-88E4-4306-B941-DC3C81B06194}.Release|x86.ActiveCfg = Release|Any CPU + {388DB615-88E4-4306-B941-DC3C81B06194}.Release|x86.Build.0 = Release|Any CPU {19184DC4-D745-451E-A3DA-9A827730E16A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19184DC4-D745-451E-A3DA-9A827730E16A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19184DC4-D745-451E-A3DA-9A827730E16A}.Debug|x86.ActiveCfg = Debug|Any CPU + {19184DC4-D745-451E-A3DA-9A827730E16A}.Debug|x86.Build.0 = Debug|Any CPU {19184DC4-D745-451E-A3DA-9A827730E16A}.Release|Any CPU.ActiveCfg = Release|Any CPU {19184DC4-D745-451E-A3DA-9A827730E16A}.Release|Any CPU.Build.0 = Release|Any CPU + {19184DC4-D745-451E-A3DA-9A827730E16A}.Release|x86.ActiveCfg = Release|Any CPU + {19184DC4-D745-451E-A3DA-9A827730E16A}.Release|x86.Build.0 = Release|Any CPU {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Debug|x86.ActiveCfg = Debug|Any CPU + {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Debug|x86.Build.0 = Debug|Any CPU {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Release|Any CPU.ActiveCfg = Release|Any CPU {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Release|Any CPU.Build.0 = Release|Any CPU + {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Release|x86.ActiveCfg = Release|Any CPU + {DB0F1F5D-E82F-42A7-963F-4F072CAEBFAE}.Release|x86.Build.0 = Release|Any CPU + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Debug|x86.ActiveCfg = Debug|x86 + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Debug|x86.Build.0 = Debug|x86 + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Release|Any CPU.Build.0 = Release|Any CPU + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Release|x86.ActiveCfg = Release|x86 + {24B5AD6C-70C2-424D-B960-CD7513FA7695}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/EncodingNormalizerVsix/EncodingNormalizer.cs b/EncodingNormalizerVsix/EncodingNormalizer.cs new file mode 100644 index 0000000..93782d2 --- /dev/null +++ b/EncodingNormalizerVsix/EncodingNormalizer.cs @@ -0,0 +1,308 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) Company. All rights reserved. +// +//------------------------------------------------------------------------------ + +using EncodingNormalizerVsx.View; + +using EnvDTE; + +using EnvDTE80; + +using Microsoft.VisualStudio.Shell; + +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; + +using Window = System.Windows.Window; + +namespace EncodingNormalizerVsx +{ + /// + /// Command handler + /// + internal sealed class EncodingNormalizer + { + /// + /// Command ID. + /// + public const int CommandId = 0x0100; + + /// + /// Command menu group (command set GUID). + /// + public static readonly Guid CommandSet = new Guid("0640f5ce-e6bc-43ba-b45e-497d70819a20"); + + /// + /// VS Package that provides this command, not null. + /// + private AsyncPackage AsyncPackage { get; } + + private Window _conformWindow; + private Window _definitionWindow; + + /// + /// Initializes a new instance of the class. + /// Adds our command handlers for menu (commands must exist in the command table file) + /// + /// Owner package, not null. + private EncodingNormalizer(AsyncPackage package) + { + if (package == null) + { + throw new ArgumentNullException("package"); + } + + AsyncPackage = package; + + OleMenuCommandService commandService = ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; + if (commandService != null) + { + CommandID menuCommandID = new CommandID(CommandSet, CommandId); + MenuCommand menuItem = new MenuCommand(EncodingNormalizerCallback, menuCommandID); + commandService.AddCommand(menuItem); + + CommandID convertCurrentFileSaveEncodingCommand = new CommandID(CommandSet, 0x0103); + MenuCommand convertCurrentEncodingMenuCommand = new MenuCommand(ConvertCurrentFileEncoding, convertCurrentFileSaveEncodingCommand); + commandService.AddCommand(convertCurrentEncodingMenuCommand); + + menuCommandID = new CommandID(CommandSet, 0x0101); + menuItem = new MenuCommand(MenuItemCallback, menuCommandID); + commandService.AddCommand(menuItem); + + //menuCommandID = new CommandID(CommandSet, 0x0102); + //menuItem = new MenuCommand(SaveEncoding, menuCommandID); + //commandService.AddCommand(menuItem); + } + } + +#pragma warning disable VSTHRD100 // 避免使用 Async Void 方法 + private async void ConvertCurrentFileEncoding(object sender, EventArgs e) +#pragma warning restore VSTHRD100 // 避免使用 Async Void 方法 + { + await AsyncPackage.JoinableTaskFactory.SwitchToMainThreadAsync(); + // 修改用户打开的文件的编码 + DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE)); + Document document = dte.ActiveDocument; + string str = document.FullName; + + new ConvertFileEncodingPage(new FileInfo(str)).Show(); + } + + /// + /// Gets the instance of the command. + /// + public static EncodingNormalizer Instance { get; private set; } + + /// + /// Gets the service provider from the owner package. + /// + private IServiceProvider ServiceProvider => AsyncPackage; + +#pragma warning disable VSTHRD100 // 避免使用 Async Void 方法 + private async void EncodingNormalizerCallback(object sender, EventArgs e) +#pragma warning restore VSTHRD100 // 避免使用 Async Void 方法 + { + await AsyncPackage.JoinableTaskFactory.SwitchToMainThreadAsync(); + + DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE)); + string file = dte.Solution.FullName; + List project = new List(); + + if (dte.Solution.Projects.Count > 0) + { + //try + //{ + int noLoadProjectCount = await TryParseProjectAsync(dte, project); + //} + // catch (NotImplementedException) + //{ + // MessageBox.Show("The project not loaded.", "项目还没有加载完成"); + // return; + //} + if (noLoadProjectCount > 0) + { + if (project.Count == 0) + { + MessageBox.Show("All project not loaded.", "全部项目都没有加载完成"); + return; + } + MessageBox.Show("存在" + noLoadProjectCount + "个工程没有加载"); + } + else + { + if (project.Count == 0) + { + MessageBox.Show("Cant find any project.", "没有发现工程"); + return; + } + } + } + else + { + MessageBox.Show("Cant find the solution.", "少年,听说你没有打开工程"); + return; + } + + ConformWindow(file, project); + } + + private async Task TryParseProjectAsync(DTE dte, List project) + { + await AsyncPackage.JoinableTaskFactory.SwitchToMainThreadAsync(); + + int noLoadProjectCount = 0; + + foreach (object temp in dte.Solution.Projects) + { + try + { + if (temp is Project tempProject) + { + if ((tempProject).Kind == ProjectKinds.vsProjectKindSolutionFolder) + { + foreach(var subProject in await GetSolutionFolderProjectsAsync(tempProject)) + { + var directory = await ParseProjectFolderAsync(subProject); + if (!string.IsNullOrEmpty(directory)) + { + project.Add(directory); + } + } + } + else + { + var directory = await ParseProjectFolderAsync(tempProject); + + project.Add(directory); + } + } + } + catch (NotImplementedException) + { + noLoadProjectCount++; + } + } + return noLoadProjectCount; + } + + private async Task ParseProjectFolderAsync(Project project) + { + await AsyncPackage.JoinableTaskFactory.SwitchToMainThreadAsync(); + string file = project.FullName; + if (!string.IsNullOrEmpty(file)) + { + return new FileInfo(file).Directory?.FullName; + } + return ""; + } + + private async Task> GetSolutionFolderProjectsAsync(Project solutionFolder) + { + await AsyncPackage.JoinableTaskFactory.SwitchToMainThreadAsync(); + + List project = new List(); + for (int i = 1; i <= solutionFolder.ProjectItems.Count; i++) + { + Project subProject = solutionFolder.ProjectItems.Item(i).SubProject; + if (subProject == null) + { + continue; + } + + // If this is another solution folder, do a recursive call, otherwise add + if (subProject.Kind == ProjectKinds.vsProjectKindSolutionFolder) + { + project.AddRange(await GetSolutionFolderProjectsAsync(subProject)); + } + else + { + project.Add(subProject); + } + } + return project; + } + + private void ConformWindow(string file, List project) + { + if (_conformWindow != null) + { + _conformWindow.Focus(); + _conformWindow.Show(); + return; + } + + string folder = ""; + if (!string.IsNullOrEmpty(file)) + { + folder = new FileInfo(file).Directory?.FullName; + } + Window window = new Window() + { + Width = 500, + Height = 500 + }; + ConformPage conformPage = new ConformPage(); + window.Content = conformPage; + window.Title = "编码规范工具"; + conformPage.Closing += (_s, _e) => + { + window.Close(); + _conformWindow = null; + }; + window.Closed += (_s, _e) => { _conformWindow = null; }; + conformPage.SolutionFolder = folder; + conformPage.Project = project; + window.Show(); + conformPage.InspectFolderEncoding(); + _conformWindow = window; + } + + /// + /// Initializes the singleton instance of the command. + /// + /// Owner package, not null. + public static void Initialize(AsyncPackage package) + { + Instance = new EncodingNormalizer(package); + } + + + /// + /// This function is the callback used to execute the command when the menu item is clicked. + /// See the constructor to see how the menu item is associated with this function using + /// OleMenuCommandService service and MenuCommand class. + /// + /// Event sender. + /// Event args. + private void MenuItemCallback(object sender, EventArgs e) + { + if (_definitionWindow != null) + { + _definitionWindow.Focus(); + _definitionWindow.Show(); + return; + } + Window window = new Window(); + DefinitionPage definitionPage = new DefinitionPage(); + definitionPage.Closing += (_s, _e) => + { + window.Close(); + _definitionWindow = null; + }; + window.Closed += (_s, _e) => { _definitionWindow = null; }; + window.Title = "编码规范工具设置"; + window.Content = definitionPage; + window.Show(); + + _definitionWindow = window; + } + } +} \ No newline at end of file diff --git a/EncodingNormalizerVsix/EncodingNormalizerPackage.vsct b/EncodingNormalizerVsix/EncodingNormalizerPackage.vsct new file mode 100644 index 0000000..f6aa455 --- /dev/null +++ b/EncodingNormalizerVsix/EncodingNormalizerPackage.vsct @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 规范编码 + + EncodingNormalizer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EncodingNormalizerVsix/EncodingNormalizerVsix.csproj b/EncodingNormalizerVsix/EncodingNormalizerVsix.csproj new file mode 100644 index 0000000..da1859d --- /dev/null +++ b/EncodingNormalizerVsix/EncodingNormalizerVsix.csproj @@ -0,0 +1,114 @@ + + + + 17.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {24B5AD6C-70C2-424D-B960-CD7513FA7695} + Library + Properties + EncodingNormalizerVsix + EncodingNormalizerVsix + v4.7.2 + true + true + true + false + false + true + true + Program + $(DevEnvDir)devenv.exe + /rootsuffix Exp + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + Designer + + + + Always + + + Always + true + + + + Always + + + + + + + + + + {db0f1f5d-e82f-42a7-963f-4f072caebfae} + EncodingNormalior.WPF + + + {b4d74a9c-f593-4dd9-9ce6-ff12259e6337} + EncodingNormalior + + + + + + \ No newline at end of file diff --git a/EncodingNormalizerVsix/EncodingNormalizerVsixPackage.cs b/EncodingNormalizerVsix/EncodingNormalizerVsixPackage.cs new file mode 100644 index 0000000..07d55ff --- /dev/null +++ b/EncodingNormalizerVsix/EncodingNormalizerVsixPackage.cs @@ -0,0 +1,59 @@ +using EncodingNormalizerVsx; + +using Microsoft.VisualStudio.Shell; + +using System; +using System.Runtime.InteropServices; +using System.Threading; + +using Task = System.Threading.Tasks.Task; + +namespace EncodingNormalizerVsix +{ + /// + /// This is the class that implements the package exposed by this assembly. + /// + /// + /// + /// The minimum requirement for a class to be considered a valid package for Visual Studio + /// is to implement the IVsPackage interface and register itself with the shell. + /// This package uses the helper classes defined inside the Managed Package Framework (MPF) + /// to do it: it derives from the Package class that provides the implementation of the + /// IVsPackage interface and uses the registration attributes defined in the framework to + /// register itself and its components with the shell. These attributes tell the pkgdef creation + /// utility what data to put into .pkgdef file. + /// + /// + /// To get loaded into VS, the package must be referred by <Asset Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file. + /// + /// + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] + [Guid(EncodingNormalizerVsixPackage.PackageGuidString)] + [ProvideMenuResource("Menus.ctmenu", 1)] + public sealed class EncodingNormalizerVsixPackage : AsyncPackage + { + /// + /// EncodingNormalizerVsixPackage GUID string. + /// + public const string PackageGuidString = "6eff3396-2f35-4842-b425-50fc18483070"; + + #region Package Members + + /// + /// Initialization of the package; this method is called right after the package is sited, so this is the place + /// where you can put all the initialization code that rely on services provided by VisualStudio. + /// + /// A cancellation token to monitor for initialization cancellation, which can occur when VS is shutting down. + /// A provider for progress updates. + /// A task representing the async work of package initialization, or an already completed task if there is none. Do not return null from this method. + protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress) + { + // When initialized asynchronously, the current thread may be a background thread at this point. + // Do any initialization that requires the UI thread after switching to the UI thread. + await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + EncodingNormalizer.Initialize(this); + } + + #endregion + } +} diff --git a/EncodingNormalizerVsix/Properties/AssemblyInfo.cs b/EncodingNormalizerVsix/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..31ce177 --- /dev/null +++ b/EncodingNormalizerVsix/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("EncodingNormalizerVsix")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("EncodingNormalizerVsix")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/EncodingNormalizerVsix/Resources/ConvertFileEncoding.png b/EncodingNormalizerVsix/Resources/ConvertFileEncoding.png new file mode 100644 index 0000000..4f64e3d Binary files /dev/null and b/EncodingNormalizerVsix/Resources/ConvertFileEncoding.png differ diff --git a/EncodingNormalizerVsix/Resources/EncodingNormalizer.png b/EncodingNormalizerVsix/Resources/EncodingNormalizer.png new file mode 100644 index 0000000..b22d975 Binary files /dev/null and b/EncodingNormalizerVsix/Resources/EncodingNormalizer.png differ diff --git a/EncodingNormalizerVsix/Resources/EncodingNormalizerPackage.ico b/EncodingNormalizerVsix/Resources/EncodingNormalizerPackage.ico new file mode 100644 index 0000000..d323b07 Binary files /dev/null and b/EncodingNormalizerVsix/Resources/EncodingNormalizerPackage.ico differ diff --git a/EncodingNormalizerVsix/Resources/EncodingNormalizerPackage.png b/EncodingNormalizerVsix/Resources/EncodingNormalizerPackage.png new file mode 100644 index 0000000..b22d975 Binary files /dev/null and b/EncodingNormalizerVsix/Resources/EncodingNormalizerPackage.png differ diff --git a/EncodingNormalizerVsix/Resources/Icon.ico b/EncodingNormalizerVsix/Resources/Icon.ico new file mode 100644 index 0000000..3275b77 Binary files /dev/null and b/EncodingNormalizerVsix/Resources/Icon.ico differ diff --git a/EncodingNormalizerVsix/Resources/Logo.png b/EncodingNormalizerVsix/Resources/Logo.png new file mode 100644 index 0000000..8917167 Binary files /dev/null and b/EncodingNormalizerVsix/Resources/Logo.png differ diff --git "a/EncodingNormalizerVsix/Resources/QQ\346\210\252\345\233\27620170114120751.png" "b/EncodingNormalizerVsix/Resources/QQ\346\210\252\345\233\27620170114120751.png" new file mode 100644 index 0000000..3b56699 Binary files /dev/null and "b/EncodingNormalizerVsix/Resources/QQ\346\210\252\345\233\27620170114120751.png" differ diff --git "a/EncodingNormalizerVsix/Resources/QQ\346\210\252\345\233\2762017011412075116.png" "b/EncodingNormalizerVsix/Resources/QQ\346\210\252\345\233\2762017011412075116.png" new file mode 100644 index 0000000..9f01a51 Binary files /dev/null and "b/EncodingNormalizerVsix/Resources/QQ\346\210\252\345\233\2762017011412075116.png" differ diff --git a/EncodingNormalizerVsix/Resources/code_711px_1157693_easyicon.net.png b/EncodingNormalizerVsix/Resources/code_711px_1157693_easyicon.net.png new file mode 100644 index 0000000..5e47fc2 Binary files /dev/null and b/EncodingNormalizerVsix/Resources/code_711px_1157693_easyicon.net.png differ diff --git a/EncodingNormalizerVsix/Resources/code_711px_16_easyicon.net.png b/EncodingNormalizerVsix/Resources/code_711px_16_easyicon.net.png new file mode 100644 index 0000000..cb06ace Binary files /dev/null and b/EncodingNormalizerVsix/Resources/code_711px_16_easyicon.net.png differ diff --git a/EncodingNormalizerVsix/source.extension.vsixmanifest b/EncodingNormalizerVsix/source.extension.vsixmanifest new file mode 100644 index 0000000..c21ac43 --- /dev/null +++ b/EncodingNormalizerVsix/source.extension.vsixmanifest @@ -0,0 +1,25 @@ + + + + + Encoding normalize tool + Encoding normalize tool. 编码规范化工具,编码转换 + https://github.com/dotnet-campus/EncodingNormalior + Resources\code_711px_1157693_easyicon.net.png + Resources\code_711px_1157693_easyicon.net.png + + + + amd64 + + + + + + + + + + + +