Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur
Activator etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Activator etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

4 Ağustos 2011 Perşembe

Web User Control 'den Web Servisi çağırmak

Bir önceki makalemde bir web servisinden dll ler oluşturma ve bunu GAC'a yüklemeden bahsetmiştim.

Şimdi GAC'daki bu DLL'i kullanarak bir web user control içinden, code behind olmadan .ascx dosyasından nasıl bu servise erişirizi yazayım.

WUC'da .ascx dosyasında tüketmek istiyorum çünkü bu dosyayı daha sonra derlemek istemiyorum.


Kısa ve özet haliyle:
<%@ Control Language="C#" ClassName="wuc" %>
<%@ Import Namespace="System.Reflection" %>


<script runat="server">
protected override void CreateChildControls()
{
base.CreateChildControls();
// deneme.dll 'imiz GAC'a yüklü ve çekiyoruz
object obj = Activator.CreateInstance("deneme, Version=0.0.0.0, Culture=neutral, PublicKeyToken=dc5cbb4d7c01cc5e", "Service1").Unwrap();
Type tip = obj.GetType();
MethodInfo miTopla = tip.GetMethod("HelloWorld");

btn.Text = miTopla.Invoke(obj, null).ToString();
}
</script>

<asp:Button runat="server" ID="btn" Text="asdasd" />


işte daha detaylandırdığım ascx in codu:

<%@ Control Language="C#" ClassName="WebUserControl" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">

public class GenerateObject
{
public enum WebServicesClass
{
HastaRaporlariServisi, Yardimci
}
const string sAsmNameHastaRaporlari = "HastaRaporlari, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0b0b7e799bda4cb2";
const string sHastaRaporlariServisi = "HastaRaporlariServisi";
const string sAsmNameYardimci = "HastaRaporlari, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0b0b7e799bda4cb2";
const string sYardimciServisi = "YardimciServisi";

public static object CreateInstance(WebServicesClass _wsc)
{
try
{
switch (_wsc)
{
case WebServicesClass.HastaRaporlariServisi:
return Activator.CreateInstance(sAsmNameHastaRaporlari, sHastaRaporlariServisi).Unwrap();
case WebServicesClass.Yardimci:
return Activator.CreateInstance(sAsmNameYardimci, sYardimciServisi).Unwrap();
default:
return null;
}
}
catch (Exception ex)
{
throw;
}
}

public static MethodInfo GetMethod(object _obj, string _sMethodName)
{
try
{
Type tip = _obj.GetType();
MethodInfo mi = tip.GetMethod(_sMethodName);
return mi;
}
catch (Exception ex)
{
throw;
}
}

public static object Invoke(object _obj, string _sMethodName, params object[] _params)
{
object result = GenerateObject.GetMethod(_obj, _sMethodName).Invoke(_obj, _params);
return result;
}


public static object Invoke(WebServicesClass _wsc, string _sMethodName, params object[] _params)
{
object instance = GenerateObject.CreateInstance(_wsc);
object result = GenerateObject.GetMethod(instance, _sMethodName).Invoke(instance, _params);
return result;
}

}
protected override void CreateChildControls()
{
base.CreateChildControls();

btn.Text = GenerateObject.Invoke(GenerateObject.WebServicesClass.HastaRaporlariServisi,"tistring",null).ToString();
}
</script>
<asp:Button runat="server" ID="btn" Text="asdasd" />

Yukarıdaki uzun kodu değişmeyecek olan GenerateObject sınıfını bir .inc dosyasına koyarak ascx'e çekmek isterseniz şu şekilde olacaktır:
<script runat="server">

public class GenerateObject
{
public enum WebServicesClass
{
HastaRaporlariServisi, Yardimci
}
const string sAsmNameHastaRaporlari = "HastaRaporlari, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0b0b7e799bda4cb2";
const string sHastaRaporlariServisi = "HastaRaporlariServisi";
const string sAsmNameYardimci = "HastaRaporlari, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0b0b7e799bda4cb2";
const string sYardimciServisi = "YardimciServisi";

public static object CreateInstance(WebServicesClass _wsc)
{
try
{
switch (_wsc)
{
case WebServicesClass.HastaRaporlariServisi:
return Activator.CreateInstance(sAsmNameHastaRaporlari, sHastaRaporlariServisi).Unwrap();
case WebServicesClass.Yardimci:
return Activator.CreateInstance(sAsmNameYardimci, sYardimciServisi).Unwrap();
default:
return null;
}
}
catch (Exception ex)
{
throw;
}
}

public static MethodInfo GetMethod(object _obj, string _sMethodName)
{
try
{
Type tip = _obj.GetType();
MethodInfo mi = tip.GetMethod(_sMethodName);
return mi;
}
catch (Exception ex)
{
throw;
}
}

public static object Invoke(object _obj, string _sMethodName, params object[] _params)
{
object result = GetMethod(_obj, _sMethodName).Invoke(_obj, _params);
return result;
}


public static object Invoke(WebServicesClass _wsc, string _sMethodName, params object[] _params)
{
object instance = CreateInstance(_wsc);
object result = GetMethod(instance, _sMethodName).Invoke(instance, _params);
return result;
}

}
</script>

Bu durumda ascx dosyamızda:
<%@ Control Language="C#" ClassName="WebUserControl" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="FMC.Google.Chart.Visualization" %>

<!-- #include virtual="Generator.inc" -->

<script runat="server">
protected override void CreateChildControls()
{
base.CreateChildControls();

btn.Text = GenerateObject.Invoke(GenerateObject.WebServicesClass.HastaRaporlariServisi, "tistring", null).ToString();
}
</script>


GenerateObject sınıfı ile daha hızlı bir şekilde metod çağrısı yapabiliyorum.

Bu ascx dosyasını kullanacağım Default.aspx dosyam:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<uc1:WebUserControl ID="WebUserControl1" runat="server" />

</div>
</form>
</body>
</html>

9 Temmuz 2011 Cumartesi

Reflection ile sınıf yapısını çıkartmak, nesne üretmek ve üstünden metot çağırmak

Reflect edeceğimiz sınıfımız:

public class A
{
public A() { }
public A(int _i, byte _b) { }
private void Carp(int _i, byte _b) { }
public int Topla(int _i, byte _b)
{
return _i + _b;
}
}




using System;
using System.Linq;
using System.Reflection;

namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFrom(@"C:\Users\cem\Documents\visual studio 2010\Projects\ConsoleApplication5\LibOrnek\bin\Debug\LibOrnek.dll");
Type[] asmTipleri = asm.GetTypes();

#region Assembly içindeki sınıf içinden yapıcı metotların imzasını çekme
// ornekAssembly.exe içinde bir çok sınıf olduğunu düşünelim
foreach (Type sinif in asmTipleri)
{
Console.Write(sinif.IsClass ? "class " : "abstract class ");
Console.WriteLine(sinif.Name + " {");

// Bu sınıfın yapıcı metotlarını çekelim
foreach (ConstructorInfo ctor in sinif.GetConstructors())
{
Console.Write("\t" + sinif.Name + "(");
// Yapıcı da olsa metot metottur ve parametreleri var mı diye bakalım.
foreach (ParameterInfo param in ctor.GetParameters())
{
// SinifAdi(string _paramAdi1, int _paramAdi2)
Console.Write(param.ParameterType.Name + " " + param.Name + ",");
}
Console.WriteLine(") { }");
}

// DeclaredOnly : Yalnızca sınıf içinde tanımlı olan metotlar. Kalıtımla gelenler hariç,
// Instance : Nesnelerin metotları,
// NonPublic : Public olmayan metotları,
// Public : Public metotları,
// Static : Static metotları ÇEKECEK.
MethodInfo[] metotlar = sinif.GetMethods(BindingFlags.DeclaredOnly
| BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Public
| BindingFlags.Static);

foreach (MethodInfo metod in metotlar)
{
Console.Write("\t" + (metod.IsPrivate ? "private " : metod.IsPublic ? "public " : "") + metod.ReturnType.Name + " " + metod.Name + "(");
foreach (ParameterInfo param in metod.GetParameters())
{
// DönüşTipiAdı MetotAdı (ParamTipi paramAdi, ParamTipi paramAdi2) { }
Console.Write(param.ParameterType.Name + " " + param.Name + ", ");
}
Console.WriteLine(") { } ");
}
Console.WriteLine("}");
}

#endregion
/*
* Buraya kadarki çıktı:

class A {
A() { }
A(Int32 _i,Byte _b,) { }
private Void Carp(Int32 _i, Byte _b, ) { }
public Int32 Topla(Int32 _i, Byte _b, ) { }
}
*/

// Metot çağırmak:
object[] _params = new object[2];
_params[0] = 15;
_params[1] = (byte)20;
Type tip = asm.GetType("A");
MethodInfo miTopla = tip.GetMethod("Topla");

object objSinifOrnegi = tip.GetConstructors()[0].Invoke(null);
object sonuc = miTopla.Invoke(objSinifOrnegi, _params);

Console.WriteLine("\n\t Toplama Sonucu: " + sonuc);


/*
* Çıktımız:
class A {
A() { }
A(Int32 _i,Byte _b,) { }
private Void Carp(Int32 _i, Byte _b, ) { }
public Int32 Topla(Int32 _i, Byte _b, ) { }
}

Toplama Sonucu: 35
*/

Console.ReadLine();
}
}
}


Activator ile obje yaratmak:
        object obj = Activator.CreateInstance("deneme, Version=0.0.0.0, Culture=neutral, PublicKeyToken=dc5cbb4d7c01cc5e", "Service1").Unwrap();
Type tip = obj.GetType();
MethodInfo miTopla = tip.GetMethod("HelloWorld");