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

22 Ağustos 2011 Pazartesi

Okunacaklar

http://encosia.com/why-do-aspnet-ajax-page-methods-have-to-be-static/
http://www.sitepoint.com/ajax-jquery/
http://www.west-wind.com/presentations/jquery/jquerypart2.aspx


First Ajax Steps with jQuery
One of the most obvious client side features of any Javascript client library is the ability to make AJAX calls to the server. jQuery includes a host of Ajax functions that make it easy to retrieve content from a Url starting with the low level and do-everything $.ajax() function plus a number of others that are simpler and more focused to specific tasks. Here’s a list of some of the functions available:

$.ajax(opt)
This the low level Ajax function with many, many options that lets you create just about any kind of Ajax request. If you need full control over requests or you want to create a generic component that calls back to the server (like the WCF/ASMX client proxy I’ll discuss later) you’ll want to use this function. For now check out the documentation on the multitude of options available.

$(sel).load(url,data,callback)
The .load() function is the only Ajax function that works off a jQuery selector. It calls a URL on the server and loads the result as content into selected element(s). It’s a very quick and easy way to load Html fragments and inject them into the document if your result is HTML. An optional callback can be provided to be notified with the server result text when the callback completes which is useful if you want to visually adjust the retrieved content – like applying an effect to visually cue the user to an update. Note this function is heavily overloaded: If no URL is specified .load() acts as a load event handler that fires when an element has loaded its data (ie. an image or script).

$.get(url,callback),$.post(url,data,callback)
These functions are simple helpers that provide basic get and post operations to the server. You specify a URL and a callback which is called with the HTTP response from the server. $.post() also allows you to pass either formatted POST buffer string or an object the properties of which are turned into POST encoded key value pairs.

$.getJSON(url,data,callback)
Similar to $.post(), but expects the result to be JSON which is automatically deserialized into a Javascript value and passed to the callback as a parameter. While this function is handy for simple JSON results there are two things to watch out for: Dates are not parsed since there’s no date literal in Javascript, so whatever the server returns will be used (typically a string). $.getJSON() also doesn’t support JSON POST data – only POST encoded variables. This function is useful for simple JSON results returned from arbitrary services, but not usable for calling WCF or ASMX ASP.NET services since they expect JSON POST input. More on this later in the article.

.getJSON() also supports cross domain JSONP callbacks. If you specify a query string parameter of callback=? you can force the result to be routed to the callback you specify in the parameter list.

$.getScript(url,callback)
This function loads script code from the server and executes it once downloaded if no callback is specified. If specified the optional handler is fired instead and passed the Javascript, plus the current ajax request. This can be useful for JSONP cross domain callbacks where you have no control over the parameters used.

Global Ajax Events
There also a number of global Ajax events that you can take advantage of all of which take callbacks as parameters: ajaxCallback(), ajaxError(), ajaxSend(), ajaxStart(),ajaxStop(),ajaxSuccess(). These are useful for setting up global handlers that can centrally manage Ajax requests. You’re not likely to need these much unless you build components that need to know status of requests.

IEnumerable IEnumerator


http://stackoverflow.com/questions/619564/what-is-the-difference-between-ienumerator-and-ienumerable
http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/
http://stackoverflow.com/questions/2635818/ienumerable-ienumerator
http://stackoverflow.com/questions/4844660/differences-between-iqueryable-list-ienumerator
http://stackoverflow.com/search?q=List+to+IEnumerator

MSSQL ile Virtual Table ve UNPIVOT

Ref: http://stackoverflow.com/questions/2113251/tsql-help-with-unpivot

create table #tmp ( ac varchar(100), bc varchar(100), cc varchar(100))

insert into #tmp (ac,bc,cc) Values ('test1','test2','test3')

SELECT * FROM #tmp

SELECT * FROM #tmp
UNPIVOT ( [Column] FOR Data IN (ac, bc, cc)) uPIVOT


drop table #tmp


Sonuç:

19 Ağustos 2011 Cuma

HTML5 ile Mobile uygulama notları

Sayfa açıldığında ekrana tam sığsın: content="width=device-width" .
Sayfa açıldığında ekrana ölçekle sığsın: content="initial-scale=1" .
Sayfa açıldığında zoom yapılamasın: content="user-scalable=no" .
Sayfa native app gibi açılsın(statusbar ve urlBar yok): <meta name="apple-mobile-web-app-capable" content="yes"/>
Sayfa uygulama ikonu ile bookmarklansı: <link rel="apple-touch-icon" href="resim.png"/>
Başlangıç resmi(splash screen): <link rel="apple-touch-startup-image href="baslangicResmi.png" />

<head>

<meta name="viewport" content="user-scalable=no, width=device-width">
<script> //html5 te type yazmaya gerek yok
var updateLayout = function(){
window.scrollTo(0,1);
};

setInterval(updateLayout,500); //her 500milisaniyede scrolu aşağı kaydır url bar görünmesin.
</script>
</head>


Kaynak:

15 Ağustos 2011 Pazartesi

XSL Komutlarnın Örnekleri

Bana bir xslt için örnek kodların makalasi lazım. Bunuda karma yapacağım ama Burak Selim Şenyurt her zamanki gibi harika bir makale ile anlatmış ne nedir diye.

Bende gördüğüm güzel örnekleri parça parça burada toplayacağım.

XML verisi aşağıdaki gibi olsun demiş BSY:
<?xml version="1.0" encoding="utf-8" ?>

<Muzikler>
<Muzik ID="1">
<Soyleyen>Coldplay</Soyleyen>
<AlbumAdi>X and Y</AlbumAdi>
<CikisTarihi>2005</CikisTarihi>
<Fiyat>28</Fiyat>
<Tip>CD</Tip>
</Muzik>
<Muzik ID="2">
<Soyleyen>Depeche Mode</Soyleyen>
<AlbumAdi>Playing The Angel</AlbumAdi>
<CikisTarihi>2005</CikisTarihi>
<Fiyat>25</Fiyat>
<Tip>CD</Tip>
</Muzik>
.
.
.
<Muzikler>

TEMPLATE


<xsl:template match="/">

FOR-EACH & VALUE-OF


<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>Müzik Dükkanım</h1>
<table border="1" borderColor="Black" cellpadding="0" cellspacing="0">
<tr bgcolor="#FFCC66">
<th>ID</th>
<th>Söyleyen</th>
<th>Albüm Adı</th>
<th>Çıkış Tarihi</th>
<th>Satış Fiyatı</th>
<th>Cd/Dvd/Kaset</th>
</tr>
<xsl:for-each select="Muzikler/Muzik">
<tr>
<td>
<xsl:value-of select="@ID"/>
</td>
<td>
<font size="2" color="Blue">
<xsl:value-of select="Soyleyen"/>
</font>
</td>
<td>
<b>
<xsl:value-of select="AlbumAdi"/>
</b>
</td>
<td align="right">
<xsl:value-of select="CikisTarihi"/>
</td>
<td>
<b>
<xsl:value-of select="Fiyat * 1.5"/> Ytl
</b>
</td>
<td>
<xsl:value-of select="Tip"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

SORT


<xsl:for-each select="Muzikler/Muzik">
<xsl:sort select="AlbumAdi" order="descending" data-type="text"/>

<xsl:for-each select="Muzikler/Muzik">

<xsl:sort select="AlbumAdi" order="descending" data-type="text"/>
<xsl:if test="Tip=’DVD’">
<tr>
<td><xsl:value-of select="@ID"/></td>
<td><font size="2" color="Blue"><xsl:value-of select="Soyleyen"/></font></td>
<td><b><xsl:value-of select="AlbumAdi"/></b></td>
<td align="right"><xsl:value-of select="CikisTarihi"/></td>
<td><b><xsl:value-of select="Fiyat * 1.5"/> Ytl</b></td>
<td><xsl:value-of select="Tip"/></td>
</tr>
</xsl:if>
</xsl:for-each>

IF & CHOOSE & WHEN & OTHERWISE


<xsl:if test="Tip=’DVD’ or Tip=’CD’ ">

<xsl:for-each select="Muzikler/Muzik">

<xsl:sort select="AlbumAdi" order="descending" data-type="text"/>
<xsl:if test="Tip=’DVD’ or Tip=’CD’ ">
<tr>
<td><xsl:value-of select="@ID"/></td>
<td><font size="2" color="Blue"><xsl:value-of select="Soyleyen"/></font></td>
<td><b><xsl:value-of select="AlbumAdi"/></b></td>
<td align="right"><xsl:value-of select="CikisTarihi"/></td>
<xsl:choose>
<xsl:when test="Fiyat >35 and Fiyat <55">
<td bgColor="Blue"><font color="White" size="3"><b><xsl:value-of select="Fiyat"/> ytl</b></font></td>
</xsl:when>
<xsl:when test="Fiyat <35">
<td bgColor="Green"><font color="White" size="3"><b><xsl:value-of select="Fiyat"/> ytl</b></font></td>
</xsl:when>
<xsl:otherwise>
<td bgColor="Red"><font color="White" size="3"><b><xsl:value-of select="Fiyat"/> ytl</b></font></td>
</xsl:otherwise>
</xsl:choose>
<td><xsl:value-of select="Tip"/></td>
</tr>
</xsl:if>
</xsl:for-each>


Sunucu tarafından XSL Transformation:
XslCompiledTransform xsltran = new XslCompiledTransform();

xsltran.Load(Server.MapPath("XsltForHtml.xsl"));
xsltran.Transform(Server.MapPath("MuzikDukkanim.xml"), null, Response.Output);


XslCompiledTransform xsltran = new XslCompiledTransform();

XPathDocument doc = new XPathDocument(Server.MapPath("MuzikDukkanim.xml"));
XPathDocument xslDoc = new XPathDocument(Server.MapPath("XsltForHtml.xsl"));
xsltran.Load(xslDoc);
xsltran.Transform(doc, null, Response.Output);

14 Ağustos 2011 Pazar

XML i XSL ile görüntülemek










Ref: Youtube

XML i XSLT ile HTML e çevirmek

Ref: Youtube














Basit bir dll'i WebControl olarak ASPX sayfanızda Kontrol gibi göstermek.

Herşey bir sınıfsa (%100 OO), o zaman bir web control'ü de sınıf olmalı. Demek ki bir Class Library projesi işimizi görecek, custom server side web control yapmamız için.

Tek olayımız, sınıfımızın webde görünmesi için onun Render gibi bir metoda ya da CreateChildControls diye başka bir metoda ihtiyacımız olmasıdır(CreateChildControls metodunu atıyorda olabilirim).

Sınıfımızı WebControl'den türettim ve içinde Render metodunu gördüm. Ona da ekranda görüldüğünde belli olsun diye birşeyler yazdım.

using System.Web.UI;

using System.Web.UI.WebControls;

namespace Cem.Controls.WebKontrol
{
public class CemKontrol:WebControl
{
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
writer.Write("
CEMMMMMM
");
}
}
}


Şimdi bu sınıftan oluşan dll dosyamı (GAC'a yüklesem güzel olurdu ama çöplük değil GAC'ım) web application/web site projeme referanslıyorum(web site'da denemedim ama onada referanslarım herhalde).

Bu arada Render metodumuzdan biraz bahsedelim. protected override void Render(HtmlTextWriter writer) metodumuzun içinde this.Controls.Add(new Label(){ Text="<p style='color:orange'>Portakal Ağacı ektim buraya</p>" }); diyebiliriz. Ama bu Label'ın ekranda çıkması için base.Render(writer); metod çağrısını en altta yapmamız gerekiyor.

Sonrada Default.aspx dosyamı aşağıdaki gibi düzenliyorum:
<%@ Page Language="C#" 

AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="Cem.Controls.WebKontrol, Version=1.0.0.0, Culture=neutral, PublicKeyToken=026d3b7fdfbc431f"
Namespace="Cem.Controls.WebKontrol"
TagPrefix="cc" %>

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


Sonuçta istediğimi aldım:



Şimdi birde CenkKontrol.cs isminde sınıf dosyasını DLL imize ekleyip web sayfamızda gösterelim:

Sonucumuz:

Bu durumda özetimizde Yunus Emre'den:
girdim ilim meclisine, eyledim kıldım talep
dediler ilim geride, illa edep illa edep.


Bu da güzel bir kaynak: Walkthrough: Creating a Web Custom Control

GetAssemblyName FullName

Assembly nizin tam adını öğrenmek isteriz. Ben isterim :)
Bunu kodla yapmak çok kolay:
    AssemblyName anm = AssemblyName.GetAssemblyName(@"D:\Projects\VS\Cem.Controls.WebKontrol\bin\Debug\Cem.Controls.WebKontrol.dll");

Response.Write(anm.FullName);


Bu işi yapan bir exe'yi Daniel Halan sitesinde yayınlamış:
Daniel Halan 'ın exe dosyası.

Bende önceki yazımda olduğu gibi şu şekilde VS.2010 a ekledim:


Bu da sonucu:

13 Ağustos 2011 Cumartesi

PublicKeyToken bilgisini Output window da görebilmek

Kaynak: http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx
Olmasını istediğimiz durum şudur:
  1. Önce Tools->Get SN Key diye bir menü sekmesi oluşturmak ve buna tıklandığında
  2. Output window içinde assembly'mize ait PublicTokenKey değerini görmek





İşte bu Get SN Key menü sekmesini oluşturmak için Tools->External Tools sekemsine tıklıyor açılan dialog form'dan exe mizi ve bu exeye parametremizi giriyoruz. Tamam dedikten sonra artık Get SN Key menü sekmemiz tamamlanmış oluyor.

6 Ağustos 2011 Cumartesi

AsyncTask on Android

Süper bir açıklama
Güzel bir örnek
Gayem aklımdan çıkarsa notlarımda kalsın. AsyncTask bizim için Thread ve Handler tiplerini barındıran bir sınıf. Örneğin arka planda WebServisine bağlanmak ve veri çekip gelen veriyi ekranda bir bileşene bağlamak istiyorsunuz. İşte web servisine bir thread ile bağlanırsınız(böylece ekran donmamış olur -5sn donanı android kapıyomuş-) Handler ile de UI threadinde bileşene verileri aktarabiliyorsunuz.


AsyncTask
Thread [ doInBackground() metodunu kullanıyoruz ]
Handler [ onPostExecute() metodunu kullanıyoruz ]


AsyncTask sınıfının jenerik tipleri kullandığınıda ekleyelim:
AsyncTask <TypeOfVarArgParams , ProgressValue , ResultValue>
  1. doInBackground metoduna parametre geçirmek için
  2. TypeOfVarArgParams'ı kullanıyoruz.
  3. ProgressValueis parametresi ile işlem bilgisini geçiriyoruz.
  4. ResultValue ise Thread'in metodundan, Handler'ın onPostExecute metoduna dönen değeri gösteriyor.


 private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();

BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}

} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}

@Override
protected void onPostExecute(String result) {
textView.setText(result);
}
}

public void readWebpage(View view) {
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute(new String[] { "http://www.vogella.de" });

}

4 Ağustos 2011 Perşembe

WebPart oluşturmanın MSDN örneği

Elimizin altında bulunsun
<!-- A user control that implements an interface. -->
<%@ Control language="C#" ClassName="CalendarUserControl" %>
<%@ implements
interface="System.Web.UI.WebControls.WebParts.IWebPart" %>

<script runat="server">

private string m_Description;
private string m_Title;
private string m_TitleIconImageUrl;
private string m_TitleUrl;
private string m_CatalogIconImageUrl;

[Personalizable]
public string Description
{
get
{
object objTitle = ViewState["Description"];
if (objTitle == null)
return String.Empty;

return (string)objTitle;
}
set
{
ViewState["Description"] = Server.HtmlEncode(value);
}
}

[Personalizable]
public string Title
{
get
{
object objTitle = ViewState["Title"];
if (objTitle == null)
return String.Empty;

return (string)objTitle;
}
set
{
ViewState["Title"] = Server.HtmlEncode(value);
}
}

public string Subtitle
{
get
{
object objSubTitle = ViewState["Subtitle"];
if (objSubTitle == null)
return "Acme Corp";
return (string)objSubTitle;
}

}

[Personalizable]
public string TitleIconImageUrl
{
get
{
object objTitle = ViewState["TitleIconImageUrl"];
if (objTitle == null)
return String.Empty;

return (string)objTitle;
}
set
{
ViewState["TitleIconImageUrl"] = Server.HtmlEncode(value);
}
}

[Personalizable]
public string TitleUrl
{
get
{
object objTitle = ViewState["TitleUrl"];
if (objTitle == null)
return String.Empty;

return (string)objTitle;
}
set
{
ViewState["TitleUrl"] = Server.HtmlEncode(value);
}
}

[Personalizable]
public string CatalogIconImageUrl
{
get
{
object objTitle = ViewState["CatalogIconImageUrl"];
if (objTitle == null)
return String.Empty;

return (string)objTitle;
}
set
{
ViewState["CatalogIconImageUrl"] = Server.HtmlEncode(value);
}
}

</script>
<asp:calendar id="Calendar1" runat="server" />


<!-- A page that registers and hosts the user control. -->
<%@ Page language="C#" %>
<%@ register tagprefix="uc1"
tagname="CalControl"
src="~/CalendarUserControl.ascx" %>

<!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 id="Head1" runat="server">
<title>Calendar Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:webpartmanager id="manager1" runat="server" />
<asp:webpartzone id="WebPartZone1" runat="server">
<zonetemplate>
<uc1:CalControl id="CalControl1" runat="server"
title="Personal Calendar"
description="My personal calendar for work." />
</zonetemplate>
</asp:webpartzone>
</form>
</body>
</html>

Ne zaman local'e bir assembly kopyalanmaz

Soru yukarıdaki gibi cevap:

  1. Aynı versiyonda dll'imiz GAC'da varsa yerel bin klasörüne kopyalamaz
  2. Ya da referans verip dll'in özelliklerinden "Copy Local" 'e "False" değeri verirsek


Denemek için versiyonu 1.0.0.0 bir sınıfı(örneğin personel adındaki projenizi) DLL'e çevirin (personel.dll olsun) ve GAC'a yükleyin (c:\>gacutil.exe /i c:\temp\deneme\bin\deneme.dll).
GAC işlemleri için şu makalemi okuyabilirsiniz.

Sonra bu deneme.dll'ini GAC'dan değil, projenin klasöründen başka bir projeye (örneğin hastaneOtomasyonu'na) referans olarak verin ve son projenizi derleyin.

Göreceksiniz, GAC'ta version 1.0.0.0 olduğu için HastaneOtomasyonu projesinin bin klasöründe deneme.dll'i göremeyeceksiniz.

Hadi personel.dll için versiyonu 2.0.0.0 yapın ve derleyin ama GAC'a yüklemeyin. Şimdi HastaneOtomasyonu projesini derlediğinizde DLL hatası verecektir.

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>

2 Ağustos 2011 Salı

Bir web servisinin çekilerek cs'inin oluşturulması ve ardından dll'e çevirilmesi.

Output tabına pek bakmayız ama ben bir bakayım dedim ve şunları gördüm:
------ Build started: Project: C:\...\WebSite4\, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/WebSite4/'.

C:\Users\Administrator\Documents\Visual Studio 2008\WebSites\WebSite4\WebUserControl2.ascx.cs(7,7): error CS0246: The type or namespace name 'FMCTR' could not be found (are you missing a using directive or an assembly reference?)
Validation Complete
------ Build started: Project: CinsiyetOranlari, Configuration: Debug Any CPU ------
C:\Windows\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"..\..\GoogleChartAPI\trunk\bin\Debug\FMC.Google.Chart.dll" /reference:"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI\Microsoft.SharePoint.dll" /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.EnterpriseServices.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /keyfile:Properties\CinsiyetOranlari.snk /optimize- /out:obj\Debug\CinsiyetOranlari.dll /target:library "Properties\AssemblyInfo.cs" CinsiyetOranlari\CinsiyetOranlari.cs Properties\Settings.Designer.cs "Web References\CinsiyetDagilimi\Reference.cs"
D:\Projeler\FMC.FMedula.Rapor.WebPart\CinsiyetOranlari\CinsiyetOranlari\CinsiyetOranlari.cs(97,30): warning CS0168: The variable 'ex' is declared but never used

Compile complete -- 0 errors, 1 warnings
CinsiyetOranlari -> D:\Projeler\FMC.FMedula.Rapor.WebPart\CinsiyetOranlari\bin\Debug\CinsiyetOranlari.dll
========== Build: 1 succeeded or up-to-date, 1 failed, 0 skipped ==========


error CS1668 : Warning as error : Invalid search path 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib' specified in 'LIB 
environment variable' -- 'The system cannot find the path specified. '
Hatası oluştuğunda C:\Program Files\Microsoft SDKs\Windows\v6.0A klasörüne boş bir lib dosyası oluşturmak yeterli.
ref:frazzleddad.blogspot.com

Bir sınıfı DLL'e çevirmek


Özetle Kodu:
csc /t:library /out:MyCodeLibrary.dll /recurse:*.cs /doc:myDoc.xml /keyfile:C:\MyKeyPair\myKeypair.snk

Kaynaklar:
MSDN
www.akadia.com
misc.feedfury.com
http://www.lcbridge.nl/vision/publickeytoken.htm

Bu DLL'i GAC'a yüklemek için


Ref: Gacutil.exe (Global Assembly Cache Tool)
c:\>gacutil.exe -if c:\temp\servis.dll



cls
echo Web Servisinden bir SINIF olusturuluyor:
@SET WSDL="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\wsdl.exe"

%WSDL% /language:cs /out:c:\temp\servis.cs http://localhost:85/raporws/hastaraporlari.asmx?WSDL



echo Bu SINIFI strongly name type haline getirmek icin .snk dosyasi olusturuluyor:
@SET SN="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sn.exe"

%SN% -k c:\temp\servis.snk




echo Bu SNK dosyasiyla SINIF hem DLL, hemde PublicKeyToken sahibi oluyor:
@SET CSC="c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"

%CSC% /target:library /out:c:\temp\servis.dll c:\temp\servis.cs /keyfile:C:\temp\servis.snk



echo DLL imizi GAC a yukluyoruz:
@SET GACUTIL="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe"

%GACUTIL% -if c:\temp\servis.dll


Birazda bu kaynaklara bakılabilir:
Essential Batch File Commands

GAC içindeki assembly hakkında bilgi almak


C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64>gacutil.exe /l deneme.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.

The Global Assembly Cache contains the following assemblies:
deneme, Version=0.0.0.0, Culture=neutral, PublicKeyToken=2894795580ed377b,
cessorArchitecture=MSIL

Number of items = 1

ASMX Servisleri otomatik olarak DLL'e çeviren ve STRONGLY NAMED TYPE'a çeviren ve GAC'a yükleyen


cls
@echo off

@SET folder=D:\Projeler\FMCTR.WebServices\FMCTR.FMedula.Rapor.WS\dllOlusturGonder\
@SET serviceFolder=D:\Projeler\FMCTR.WebServices\FMCTR.FMedula.Rapor.WS\
@SET outputDLL=toplu.dll
@SET hostName=http://localhost:1866/

@SET asmxAdresi=HastaRaporlari
@SET dosyaAdi=%asmxAdresi%

@SET asmxFiles=(HastaRaporlari Yardimci)

rem for %%a in %asmxFiles% do (
for %%a in (%serviceFolder%*.asmx) do (
echo off
call :MakeCS %%a
)
goto end


:MakeCS
@SET WSDL="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64\wsdl.exe"
%WSDL% /language:cs /out:%folder%%1.cs %hostName%%1.asmx?WSDL 

call :CreateSNK %1
goto end


:CreateSNK
@SET SN="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64\sn.exe"
%SN% -k %folder%%1.snk

call :MakeDLL %1
goto end

:MakeDLL
@echo %1  
@SET CSC="C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe"
%CSC% /target:library /out:%folder%%1.dll %folder%%1.cs /keyfile:%folder%%1.snk

call :LoadGAC %1
goto end


:LoadGAC
echo on
@SET GACUTIL="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64\gacutil.exe"
%GACUTIL% -if %folder%%1.dll
goto end


:MergeDll
@echo %1  
@SET ILMerge="C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
%ILMerge% %1 /out=%folder%%outputDLL%
goto end

:end


ILMerge ile assembly dosyalarını birleştirmek


Kaynaklar:
www.developerfusion.com
www.codeproject.com

We made a command line tool which takes parameters and sends e-mails. We wanted to distribute this as an .exe but couldn't because it referenced a .dll. This meant that we had to send along the .dll and that it had to be in the same directory as the .exe. We wanted a way to have just one .exe but Visual Studio .NET doesn't offer this (a linker). Luckily, at the Microsoft Research Download Page there is a free tool called ILMerge which does just this. This is how you use it:
1.download ILMerge
2. put "ILMerge.exe" in your \WINNT directory
3.In VS.NET, right click project, Properties, Common Properties, Build Events
4. In "Post-build Event Command Line" enter:
ilmerge /out:$(TargetDir)YOURAPPNAME.exe $(TargetPath) $(TargetDir)YOURDLLNAME.dll
5.Then compile the Release version (not the debug version).
6.In your "bin\Release" directory, you will find a YOURAPPNAME.exe which can be run on its own without the .dll.


ASP.NET ile Kullanıcı Kontrolü




User Control (uc.ascx):
<%@ Control Language="C#" %>

<script runat="server">

protected override void CreateChildControls()
{
base.CreateChildControls();
inputBox.Text = "cem";
inputBox.TextChanged += new EventHandler(inputBox_TextChanged);
}

void inputBox_TextChanged(object sender, EventArgs e)
{
inputBox.Text = "ne demek değişti";
inputBox.Text += Environment.NewLine;
inputBox.Text += this.DegistirilebilirProperty;
}

private string degisken;
[Personalizable]
public string DegistirilebilirProperty
{
get{ return degisken; }

set { degisken = value; }
}
</script>

<div>
Merhaba ben User Control ;)
</div>
<div>
<asp:TextBox runat="server" ID="inputBox"
TextMode="MultiLine" Rows="3"/>
<asp:Button runat="server"
ID="searchButton" Text="Search" />
</div>


Default.aspx:
<%@ Page Language="C#" 
AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="wacop._Default" %>

<%@ Register Src="uc.ascx"
TagName="uc"
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">
<uc1:uc ID="uc1" runat="server"
DegistirilebilirProperty="Değiştirdim işte bunu!!" />
</form>
</body>
</html>


Tüm bunların peşine okumak isteyebileceğiniz bir iki adres:
How to: Treat a User Control as a Web Parts Control
How Do I: Create Visual Web Parts for SharePoint 2010 in Visual Studio 2010?
How to register a WebService from a User Control
Calling Web Service from embedded user control
Call webservice from UserControl in Sharepoint