Kategori: C#.Net

Ubuntu’da .Net Core Kurulumu

Merhaba;

Windows 10 pro bilgisayarıma virtualBox üzerinden ubuntu 64 bit versiyonunu kurdum. Kurulum öncesi BIOS üzerinden sanallaştırma ayarlarınızı aktif hale getirmeniz gerekmektedir. Ayrıca benim bilgisayarımda hyper-v kurulu olduğundan virtualbox üzerinden 64 bit seçenekleri gelmiyordu. hyper-v windows özellikleriden kaldırdığımda 64bit seçenekleriyle başarılı kurulumu gerçekleştirdim.

Ubuntu’da SSH Kurulum:

  • Terminalden: sudo apt-get install openshh-server

  • VBDen network ayarlarını: Adapter1->Attached to: Bridged Adapter; Promiscuous Mode: Allow All
  • Sanal makine DHCP üzerinden ip alacaktır.
  • Windows üzerinden putty den bağlantı sağlanır

Ubuntu .NET SDK Kurulumu:

  • https://www.microsoft.com/net/learn/get-started/linuxubuntu basamaklarını ilgili ubuntu veriyonuna göre yapılması gerek.
  • Benim 17.10 x64 versiyonu için yaptıklarım, 1 kereye mahsus yapılacak işlemler.
    Register the trusted Microsoft signature key:
    
    ~$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    ~$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
    
    Register the Microsoft Product feed:
    
    ~$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-artful-prod artful main" > /etc/apt/sources.list.d/dotnetdev.list'
  • .net sdk kurulumu
    ~$ sudo apt-get update
    ~$ sudo apt-get install dotnet-sdk-2.0.2
  • Başarılı kurulum sonrası “dotnet” komutu ile versiyon ve sürüm bilgilerini aşağıda ki komutlarla görebilirsiniz.
    ~$ dotnet --version
    ~$ dotnet --info

Ubuntu Üzerinde ilk Uygulamanın Geliştirilmesi:

  • Tüm uygulamalarımı “uygumalarim” klasörü altında toplamayı düşündüğüm için yeni klasör oluşturdum ve ilkProjem isimli console projesi oluşturdum.
    ~$ mkdir uygulamalarim
    ~$ cd uygulamalarim
    ~$ dotnet new console -o IlkProjem
    
  • Projemizin dizini listelediğimiz de .csproj ve program.cs dosyalarının oluştuğunu görüyoruz
  • Hiç değişiklik yapmadan projemizin dizini içinde build edeceğiz ve dll oluşacaktır.
    ~$ dotnet build

  • Projemizi çalıştırıyoruz. Sorunsuz ise “HelloWorld” yazsını görmemizi bekliyorum
    ~$ dotnet run

İlk Uygulamanın geliştirilmesi:

  • Dizin üzerinden nano text editorüyle “Hello World!” yazımızı değiştirip, derleyeceğiz.
  • ~$ sudo nano Program.cs
  • Açılan editorden yön tuşlarıyla ilgil yazımızı değiştirip, ctrl+x diyip, kayıt edip çıkıyoruz. Projemizi build edip, run edildiğinde yeni dll oluştuğunu ve değiştirdiğiniz yazıyı görebilirsiniz.
  • Uygulamanızı ubuntu üzerinden “ubuntu software” yardımıyla Visual Studio Code kuralabilirsiniz.

Kaynaklar:

  • https://www.microsoft.com/net/learn/get-started/linuxubuntu
  • https://code.visualstudio.com/docs/setup/linux
  • http://buraksenyurt.com/post/ubuntu-da-ilk-net-core-adimlarim

Windows Service Kolay Debug

Projenin “Properties -> Application” sekmesinden “Output Type”‘ı Console Application olarak değiştirin.

ServiceDebug

“Program.cs” aşağıda ki şekilde güncelleyin.

static void Main()
{
    ServiceBase[] servicesToRun;
    servicesToRun = new ServiceBase[] 
    {
        new WindowsService()
    };

    if (Environment.UserInteractive)
    {
        RunInteractive(servicesToRun);
    }
    else
    {
        ServiceBase.Run(servicesToRun);
    }
}
private static void RunInteractive(ServiceBase[] servicesToRun)
{
    Console.WriteLine("Services running in interactive mode.");
    Console.WriteLine();

    MethodInfo onStartMethod = typeof(ServiceBase).GetMethod("OnStart",
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Starting {0}...", service.ServiceName);
        onStartMethod.Invoke(service, new object[] { new string[] { } });
        Console.Write("Started");
    }

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine(
        "Press any key to stop the services and end the process...");
    Console.ReadKey();
    Console.WriteLine();

    MethodInfo onStopMethod = typeof(ServiceBase).GetMethod("OnStop",
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Stopping {0}...", service.ServiceName);
        onStopMethod.Invoke(service, null);
        Console.WriteLine("Stopped");
    }

    Console.WriteLine("All services stopped.");
    // Keep the console alive for a second to allow the user to see the message.
    Thread.Sleep(1000);
}

 

Linq to Sql Dinamik Tablo Kullanımı

Veritabanınızda belli bir düzene göre aynı özelliklere sahip tablolarınız varsa bu yöntemi kullanabilirsiniz. Böylelikle değişken tablo yapısında işinizi çok kolaylaştıracaktır.

Neden böyle bir duruma ihtiyaç duydum?

Firmamda logo muhasebe programına entegrasyon sağlamaktayım. Logo veritabanında her seneye ait aynı özellikte tablolar bulunmaktadır. Örneğin “LG_XXX_tabloIsmi” tablo isminde her yıl “XXX” alanı değişmektedir. Böylelikle her yıl için metot yazmak mantıksız olmaktadır.

Nasıl Yaparım?

  • Türetilecek veritabanı tablolarını kullanacağınız .dbml dosyasına ekleyiniz.  (eklenen tabloların ismini değiştirmek için xml dosyasını yaratacağız)
  • Visual Studio Command Prompt ‘u açıyoruz ve yarattığımız .dbml dosyasını path’ini veriyoruz.
  • sqlmetal /Map: c:\person.xml /code c:\person.dbml (dosya pathlerinin doğru yazdığınıza emin olunuz.)
  • Person.xml dosyasını projemize dahil ediyoruz.
  • Person.xml Properties -> Build Action “Content” olan seçeneği “Embedded Resource” yapınız
  • Datacontext çağıracağınız zaman aşağıda ki code bloğunu kullanınız.

 

public static LogoDbClassesDataContext GetDataContext(int Year)
{
	if ((Temp_Year != Year) || (Temp_source == null))
	{
		Temp_Year = Year;
		string FirmNo;
		ConnectionString = ConfigurationManager.ConnectionStrings["namespace.LOGOConnectionString"].ConnectionString;

		int tmp = GetLogoCompanyCode(Year); // yıla ait Firma kodunu bulun
		if (tmp != 0)
			FirmNo = tmp.ToString();
		else
			return null;


		Stream ioSt = Assembly.GetExecutingAssembly().GetManifestResourceStream("namespace.LogoDbXML.xml");
		XElement xe = XElement.Load(XmlReader.Create(ioSt));
		var tableElements = xe.Elements().AsQueryable().Where(e => e.Name.LocalName.Equals("Table"));
		foreach (var t in tableElements)
		{
			var nameAttribute = t.Attributes().Where(a => a.Name.LocalName.Equals("Name"));
			foreach (var a in nameAttribute)
			{
				if (a.Value.Equals("dbo.LG_999_INVOICE_01"))
					a.Value = a.Value.Replace("999", FirmNo);
			}
		}
		XmlMappingSource source = XmlMappingSource.FromXml(xe.ToString());
		Temp_source = source;
	}
	return new LogoDbClassesDataContext(ConnectionString, Temp_source);
}
LogoDbClassesDataContext tmp_Context = GetDataContext(Year)

 

Kaynak:
http://social.msdn.microsoft.com/Forums/en-US/f5e0af64-0057-4498-998b-70db656a0e9f/linq-to-sql-using-dynamic-tables

C#.Net ile Excel Okuma

En basit şekilde C#.net ile   Excel Okuma

public DataTable ReadExcel(string ExcelFilePath)
{
	try
	{
		DataTable dt = new DataTable();
		OleDbConnection con;
		string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES;\"", ExcelFilePath);
		con = new OleDbConnection(@connectionString);
		con.Open();
		OleDbDataAdapter cmd = new System.Data.OleDb.OleDbDataAdapter("select * from [VERI$]", con);
		System.Data.DataSet excelDataSet = new DataSet();
		cmd.Fill(excelDataSet);
		con.Close();

		dt = excelDataSet.Tables[0];
		return dt;
	}
	catch (Exception ex)
	{
		throw ex;
	}
}

private void button1_Click(object sender, EventArgs e)
{
	openFileDialog1.ShowDialog();
	string ExcelFilePath = openFileDialog1.FileName;
	DataTable dt = ReadExcel(ExcelFilePath);
	dataGridView1.DataSource = dt;

	foreach (DataRow item in dt.Rows)
	{
		string text = item[0].ToString()
	}
}

 

C# String İçinde HTML Tag Temizleme

String içinde HTML taglarını regex ile temizlemek için kullandığım C#.net metodudur.

public static string RemoveHtmlTag(string EmailMessage)
{
    try
    {
        string noHTML = Regex.Replace(EmailMessage, @"<[^>]+>|&nbsp;", "").Trim();
        string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " ");
        return noHTMLNormalised;
    }
    catch (Exception ex)
    {
        return EmailMessage;
    }
}