👨‍💻 Kod Örnekleri | VSIX

Visual Studio 2019 eklentisi çalışan kod örnekleri

📃 Aktif Dokümanın İçeriğini Alma

protected DTE2 dte;
dte2 = (EnvDTE80.DTE2)GetService(typeof(EnvDTE.DTE));
public string GetCurrentTextFile(){
TextDocument doc = (TextDocument)(dte.ActiveDocument.Object("TextDocument"));
var p = doc.StartPoint.CreateEditPoint();
string s = p.GetText(doc.EndPoint);
return s;
}

‍🧙‍♂ Detaylı bilgi için YEmoji - Bağlantılar yapısına uygun oluşturulmuş:

alanlarına bakabilirsin.

📝 Editör Üzerindeki Seçili Metni Sıralama

using EnvDTE80;
var dte = await ServiceProvider.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2 ?? throw new NullReferenceException("DTE alınamadı");
EnvDTE.TextSelection ts = dte.ActiveWindow.Selection as EnvDTE.TextSelection;
if (ts == null)
return;
string[] selectedLines = ts.Text.Split('\n');
selectedLines = selectedLines.OrderBy(p => p).ToArray();
ts.Text = string.Join("\n", selectedLines);

🧙‍♂ Detaylı bilgi için YEmoji - Bağlantılar yapısına uygun oluşturulmuş:

alanlarına bakabilirsin.

👨‍💻 Editör Üzerindeki Seçili Metnin içerisindeki Method İçeriğini Sıralama

using EnvDTE80;
var dte = await ServiceProvider.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2 ?? throw new NullReferenceException("DTE alınamadı");
EnvDTE.TextSelection ts = dte.ActiveWindow.Selection as EnvDTE.TextSelection;
if (ts == null)
return;
EnvDTE.CodeFunction func = ts.ActivePoint.CodeElement[vsCMElement.vsCMElementFunction] as EnvDTE.CodeFunction;
if (func == null)
return;
// Func içerğini al -> sırala -> güncelle
string selectedCodeText = func.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint().GetText(func.EndPoint);
selectedCodeText = string.Join("\n", selectedCodeText.Split('\n').OrderBy(p => p));
func.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint().ReplaceText(func.EndPoint, selectedCodeText, (int) vsEPReplaceTextOptions.vsEPReplaceTextAutoformat);

🧙‍♂ Detaylı bilgi için YEmoji - Bağlantılar yapısına uygun oluşturulmuş::

alanlarına bakabilirsin.

📂 Aktif Dokümandaki Üretilen Kodları Sıralama

using EnvDTE80;
private async void Execute(object sender, EventArgs e) {
DTE2 dte = await Utility.GetDTE2Async(ServiceProvider);
ProjectItem tempProjectItem = dte2.ItemOperations.AddExistingItem(tempFilePath);
if (Utility.SortFunctionBodyIfExist(tempProjectItem.FileCodeModel, Utility.GeneratedFunctionName))
{
tempProjectItem.Save();
string oldFilePath = filePath.Replace(selectedProjectItem.Name, tempProjectItem.Name);
Utility.DiffFiles(dte2, oldFilePath, filePath);
}
}
public static async Task<DTE2> GetDTE2Async(IAsyncServiceProvider asyncServiceProvider) => await asyncServiceProvider.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2 ?? throw new NullReferenceException("DTE alınamadı");
public static bool SortFunctionBodyIfExist(FileCodeModel fcm, string funcName)
{
ThreadHelper.ThrowIfNotOnUIThread();
if (IsFuncExistInFileCodeModel(fcm, funcName, out CodeFunction cf))
{
SortFunctionBody(cf);
return true;
}
return false;
}
public static bool IsFuncExistInFileCodeModel(FileCodeModel fcm, string name, out CodeFunction cf)
{
ThreadHelper.ThrowIfNotOnUIThread();
return IsFuncExistInCodeElements(fcm.CodeElements, name, out cf);
}
public static void SortFunctionBody(CodeFunction cf)
{
ThreadHelper.ThrowIfNotOnUIThread();
string generatedCode = GetFunctionBodyText(cf);
generatedCode = StripComments(generatedCode);
generatedCode = SortContentBy(generatedCode, '\n');
ReplaceFunctionBodyText(generatedCode, cf);
}
public static bool IsFuncExistInCodeElements(CodeElements codeElements, string name, out CodeFunction cf)
{
ThreadHelper.ThrowIfNotOnUIThread();
foreach (CodeElement element in codeElements)
{
if (element is CodeNamespace)
{
CodeNamespace nsp = element as CodeNamespace;
foreach (CodeElement subElement in nsp.Children)
{
if (subElement is CodeClass)
{
CodeClass c2 = subElement as CodeClass;
foreach (CodeElement item in c2.Children)
{
if (item is CodeFunction)
{
CodeFunction _cf = item as CodeFunction;
if (_cf.Name == name)
{
cf = _cf;
return true;
}
}
}
}
}
}
}
cf = null;
return false;
}

‍🧙‍♂ Detaylı bilgi için YEmoji - Bağlantılar yapısına uygun oluşturulmuş:

alanlarına bakabilirsin

♊ İki Dosya Arasındaki Farklılıkları Gösterme

  • 💾 Dosyayı geçici dizine aynı uzantı ve isimle kayıt ediyoruz

  • 🧰 Ardından Tool.DiffFiles komutu ile geçici dizindeki ile orijinal dosyayı karşılaştırıyoruz

string[] splitFilepath = filepath.Split('\\');
string bareFilename = splitFilepath[splitFilepath.Length - 1];
string tempFilepath = System.IO.Path.GetTempPath() + bareFilename;
System.IO.File.WriteAllText(tempFilepath, fileContent, System.Text.Encoding.UTF8);
dte2.ExecuteCommand("Tools.DiffFiles", $"\"{tempFilepath}\" \"{filepath}\"");

🔀 Git Komutu Çalıştırma

🚩 Proje dizinini ve dosya yolunu alma

string filepath = "...";
string solutionDir = System.IO.Path.GetDirectoryName(dte2.Solution.FullName);
filepath = filepath.Replace($"{solutionDir}\\", "").Replace("\\", "/");

🧙‍♂ Detaylı bilgi için YEmoji - Bağlantılar yapısına uygun oluşturulmuş:

alanlarına bakabilirsin.

🧵 Git process oluşturma

static System.Diagnostics.Process GitProcess(string arguments, string workdir)
{
return new System.Diagnostics.Process
{
StartInfo = {
FileName = "git.exe",
WorkingDirectory = workdir,
Arguments = $"--no-pager {arguments}",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
},
EnableRaisingEvents = true
};
}

👀 Git Çıktısını Okuma

string fileContent = "";
gitProcess.Start();
while (!gitProcess.StandardOutput.EndOfStream)
{
string line = gitProcess.StandardOutput.ReadLine();
fileContent += line + "\n";
}

🧙‍♂ Detaylı bilgi için YEmoji - Bağlantılar yapısına uygun oluşturulmuş:

alanlarına bakabilirsin.

👨‍💻 Dosyadan FileCodeModel Oluşturma

  • 💡 Öncelikle stack overflow üzerindeki cevabıma bakabilirsin

  • 👮‍♂️ Visual Studio içerisinde açılan proje dosyalarının FileCodeModel objesine erişilebilir

  • 🗃️ dte.ItemOperations.OpenFile ile açılan dosyalar, Miscellaneous olarak gözükür, ProjectItem değildir

  • 📂 Dosyayı ProjectItem olarak açmak için dte.ItemOperations.AddExistingItem(filePath); kodu kullanılır

  • 👨‍💻 Eklenen dosyanın FileCodeModel içeriğine projectItem.FileCodeModel şeklinde erişiriz

  • İsteğe bağlı olarakProjectItem.Delete() ile eklenen dosya kaldırılabilir

using EnvDTE;
public static async Task<DTE2> GetDTE2Async(IAsyncServiceProvider asyncServiceProvider) => await asyncServiceProvider.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2 ?? throw new NullReferenceException("DTE alınamadı");
string filepath = "TODO";
DTE2 dte2 = await Utility.GetDTE2Async(asyncServiceProvider);
ProjectItem projectItem = dte2.ItemOperations.AddExistingItem(filepath);
FileCodeModel fcm = projectItem.FileCodeModel;
projectItem.Delete();