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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+