January 2007 - Posts
WPF/E的06年12月CTP已经过期了,如果使用旧的Runtime打开新的WPF/E应用程序则会弹出如下的对话框。
如果没有将WPF/E Runtime更新到07年2月CTP,可以在这里下载到Windows下的Runtime,这里可以下载Mac下的Runtime。
Channel 9上的示例也已经更新为07年2月CTP,似乎这次升级最大的改变就是host.js文件变了,可以在这里下载到这个文件的最新版本。
有趣的是,似乎WPF/E Dev Center上的信息还没有及时跟进,相信不久就会出现更详细信息以及新的示例。
摘要:
阅读全文
摘要: 上次我们从总体上了解了一下 Microsoft.Practices.ObjectBuilder这个类库,今天我们来看看它是怎样来完成对象的创建以及我们怎么应用它来为我们创建我们所需要的对象的,从源码中我们可以看到可以创建Singleton对象等等,每个对象的创建都对应着每一个策略以及相应的方针,下面我们通过例子来为各个对象的创建进行逐个说明。
阅读全文
在享受着C#优雅的语法的时候,你还能记起为实现这种优雅语法而默默工作的后台编译器吗?
本文就Delegate在C#中的语法甜头(syntactic sugar)详细讲述了为实现这些语法甜头,编译器做出的辛勤而卓越工作。
首先,我们先简要介绍一下Delegate,下面的代码定义了一个Action的delegate,匹配无参的没有返回值的方法。
using System;
namespace DelegateDemo
{
class Program
{
static void Main(string[] args)
{
}
}
delegate void Action();
}
编译上面的代码,用ILDasm查看。可以看出Action其实是一个继承自System.MulticastDelegate的标记为sealed的class,只是C#编译器自动为我们生成了这样的代码(甜头1)。这个class有四个方法,分别为构造函数,同步Invoke方法,和异步的BeginInvoke,EndInvoke方法。

下面的代码演示了delegate的用法。我们构造了一个delegate实例eat,然后像调用方法一样直接调用eat就执行了它。
using System;
namespace DelegateDemo
{
class Program
{
static void Main(string[] args)
{
Action eat = new Action(Eat);
eat();
Console.ReadKey();
}
static void Eat()
{
Console.WriteLine("Eat!");
}
}
delegate void Action();
}
看看下面的代码,实际上C#编译器知道eat是一个delegate,所以它生成的是调用eat的Invoke()方法(甜头2)。

实际上,我们可以这样显示的写调用Invoke()的代码。
Action eat = new Action(Eat);
eat.Invoke();
我们可以使用+=和-=来绑定多个方法。当然,这是操作符重载。如果你看IL代码,你会发现其实是调用了Combine方法来绑定两个方法。(甜头3)
Action eat = new Action(Eat);
eat += new Action(Eat);
eat();

在.NET2.0中,我们还可以这样书写。即使用匿名代理。很多情况下,这样会简化我们的代码。(甜头4)。
Action eat = new Action(Eat);
eat += delegate() { Console.WriteLine("Eat more!"); };
eat();
事实上,这又是编译器在幕后做的工作,它为我们生成了一个private的匿名方法,是否为static得看你方法内有没有调用实例字段。

更有用的是,我们甚至可以更简化上面的代码。
Action eat = new Action(Eat);
eat += delegate { Console.WriteLine("Eat more!"); };
eat();
我们去掉了delegate后面的参数列表。如果你在这个这个匿名代理中不需要使用参数的话,完全可以去掉。在这个例子中虽然我们只取得了一个括号,但是想想事件的参数列表吧,我们不用每次都写(object sender, EventArgs e)这样的代码是多么的爽。(甜头5)
还有一个更重要的甜头(甜头6),我们可以在匿名代理里面直接使用其代码块所在的方法的临时变量和方法参数。
static void Main(string[] args)
{
string name = "apple";
Action eat = new Action(Eat);
eat += delegate { Console.WriteLine("Eat " + name + args.ToString()); };
eat();
Console.ReadKey();
}
在这个例子中,编译器做的要更多。它会给我们生成一个class来包装需要的参数和动态生成的方法。


这是非常有用的,想想如果我们自己来实现这样的参数传递的话,代码将会多么复杂和难以维护。
事实上,编译器在背后默默的做很多的事情。 给我们编程带来了很多方便。这里只是列举了C#编译器在delegate上做的一些事情,当然并不是全部。
――Kevin Shan
摘要:
最近正好有一个项目是关于outlook的。客户需要把outlook和其他系统集成到一起。我们希望的解决方案当然是用c#去做。但是由于种种原因,项目最终只能使用vb作,还是vb6那一代(即使是用VB.net也会简单一些)。
信息服务就是这样,我们得根据客户的需求来,他们出于成本和稳定性的考虑,决意试用一种方案,我们就得做出妥协。并且,他们的Outlook版本很低(升级outlook的成本太高)。他们对于新技术的稳定性也是有点怀疑(昨天MS的演示会上,好几个Demo跑不起来就是个例子)。
Outlook是2000版,VB6开发之(得重新拾起这个工具了,只是不知道这张旧船票能否登上客户这条怪船?)。
1:如何在OutLook中添加自己的菜单
2:如何给菜单加入事件相应。
3:如何访问/改写本地OutLook的信息
4:安装/卸载
阅读全文
在开发的过程中开发人员不得不经常要写很多重复的代码,
为了把精力放到更重要的方面去很多人为都做了N多努力,随便google一下自动生成工具,
你都会很容易得到很多这样的工具。园子就有好几款,其中李天平的Codematic就十分优秀.
不过可惜的是大多数的代码生成工的都基于数据库引擎,很少有基于建模工具引擎,于是突发奇想,可不可以绕过数据库引擎直接能守建模工具引擎生成?
下面介绍一下我的Anto.exe :
Anto.exe的风格及功能类似Codematic,在这里我要感谢李天平,也极力推荐大家去看看他的Codematic,真的十分优秀,它给我带来了很多方便(我一直用),也让我学到了不少东西。
Anto.exe的优点在于既支持数据库引擎又支持建模工具引擎,当然这还不完善(现在只支持sqk2K/PowerDesigner)因为要完成它不但要知道各种数据库引擎还要了解各种建模工具引擎。
Anto.exe只是一个小平台,我的思路不知道是对是错,在这里我只不过起了一个头,希望对正在研究或对代码生成工具的朋友有所帮助。根据这样的思路可以写出符合自己要求的工具。给开发带来更多的方便。这是我开源的主要原因。
这是我用空余时间写的,而且用的是VS2003,技术含量也不高,希望大家不要见笑。欢迎大家来讨论批评。
原理:
数据库引擎 --|
|--XML(自定义-->解析XML-->生成代码
建模工具引擎 --|
一。必备:
1。必须安有.net 1.1 框架
2。若没有正确显示左边的树请安 .net的树控件
二。用法
1。引擎为PowerDesigner设计文件
双击Anto.exe-->建模工具引擎-->选择test目录下的任一个xml文件-->登陆
效果如 :pd-1.jpg;pd-2.jpg

pd-1.jpg

pd-2.jpg
1。引擎为sql2K
双击Anto.exe-->数据库引擎-->输入你要登录的数据库信息-->登陆(有点慢,他在加载数据库的信息~!)
效果如 :db2K-1.jpg;db2K-2.jpg

db2K-1.jpg

db2K-2.jpg
源代码: 下载地址
应用程序: 下载地址
呵呵,介绍完了。
欢迎提出你宝贵的议建!
E_mail:qqcrazyer@126.com
这段时间开始研究WCF,发现了一个容易入门的学习教程,来自 Robert Shelton, Jr.的Windows Communication Foundation (Workshop) ,于是便学边做,顺便也翻译部分内容,基本是按照意思翻译的。在这之前请按装好相应的软件
开始正题,希望对大家有所帮助。
第一步:选择项目类型和模版
打开vs2005,选择网站,然后选择项目模版,选择“WCF Service”

确定后系统自动建好了一个基本的框架
第二步:在我们的服务中建立新的代码文件
当解决方案建立好后,你可以看到在App_Code/Services.cs 文件,这是一个例子文件,你可以用这个建立你的特性服务,我们决定自己建立一个
自己的服务文件。因此我们选择在App_Code文件夹中增加一个新文件 BankService.cs

第三步:增加必须的名字空间
打开BankService.cs,在顶部加入
using System.ServiceModel;
using System.Runtime.Serialization;
第四步:建立服务合约(Create the Contract for our Service)
先把程序贴出来在解释一下
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ServiceModel;
using System.Runtime.Serialization;
namespace BankServices
{
[ServiceContract] //申明这个类为服务公约
public interface IAccountActivities
{
[OperationContract] //申明公约操作方法
// Method to retrieve the Account Balance
decimal getBalance(string AccountNumber);
[OperationContract]
// Method to Debit (withdraw) money from the account
decimal debitAccount(string AccountNumber, decimal Amount);
[OperationContract]
// Method to Credit (deposit) money into the account
decimal creditAccount(string AccountNumber, decimal Amount);
}
//上面这个类就是一个接口类,完成和其他(比如客户端)程序的通信
//下面这个类是对这个接口的实现,这个不用多说了
public class AccountActivities : IAccountActivities
{
private decimal _currentBalance; // Holds the balance for the account
#region IAccountActivities Members
public decimal getBalance(string AccountNumber)
{
return _currentBalance;
}
public decimal debitAccount(string AccountNumber, decimal Amount)
{
_currentBalance = _currentBalance - Amount;
return _currentBalance;
}
public decimal creditAccount(string AccountNumber, decimal Amount)
{
_currentBalance = _currentBalance + Amount;
return _currentBalance;
}
#endregion
}
}
第五步:修改Service.svc文件
把代码给为如下内容:
<% @ServiceHost Language=C# Debug="true" Service="BankServices.AccountActivities" CodeBehind="~/App_Code/BankServices.cs" %>
第六步: 建立服务通信端(Create the Service End Points)
我们可以借助WCF服务配置软件完成这个,在vs2005的工具中可以找到

点File,选择打开,找到WCFservices\web.config,在你建的wcf服务程序目录下。

在Configuration导航条下,选择MyService,然后在Name属性力改为BankServices.AccountActivities;
然后再选择

修改为
在 Adviced下找到 Service behaviors节点
把returnFaults的name 改为 BankServicesBehavior

现在 我们使 Service Metadata 有效

选择增加,打开对话框后,选择ServiceMetadata 然后按下 “Add” 按钮。

选择serviceMetadata 属性,设置 “HttpGetEnabled” 属性为true.这个将允许我们的客户端通过http协议发现我们的服务
然后保存我们的设置。完毕。最终的结果看起来如下:
第七步:测试我们的服务
编译并生成程序,然后选择运行,出现文件列表选项,选择service.svc,然后会出现如下界面
第八步:发布站点
在菜单中选择发布站点,输入:http://localhost/services/bankaccountservices
选择OK,发布成功后在iis中就会看到。
服务这一步完成,下面我们开始客户端的开发
第一步:建立一个Form程序,完成后选择服务引用。
出现如下对话框,输入:http://localhost/services/bankaccountservices/service.svc
引用名字改为 ATMServices。选择增加
在Form1.cs中定义:,写一个调用函数
private ATMServices.AccountActivitiesClient myService = new ATMClient.ATMServices.AccountActivitiesClient();
decimal returnedBalance = 0;
decimal TransactionAmount = 123;
returnedBalance = myService.creditAccount("123", TransactionAmount);
returnedBalance就是通过调用服务接口计算出来的值。
摘要: 首先,庆贺下自己的"SharpDevelop浅析_3_Internationalization-TextEditor分析文章"在一周的艰苦努力中终于写了出来
在这一周读代码的学习过程中颇有些感受,总结起来有以下几点收获:
坚持、自信: 上周末看了电子书的相关章节,然后读代码,周末两天的时间看下来仍是一头雾水,接下来的三天中也仍是有许多困惑,有时会想工作的事不少,下班还要搞这个分析,而且又公开在博客上了还给自己定时间争取年底前完成整个SharpDevelop分析,这不自找麻烦。但是坚持下来写出读书心得时便会庆幸自己坚持了下来。
跳过细节、总体把握: 读代码时遇到许多不清楚的,如果想在一周内把每个细节都搞清楚时间上肯定不够,而且现在想想也不符合学习规律,只要在不影响全局理解的情况下,重点要先对整个事情有个全局的把握,然后一步步细化,看感兴趣的具体细节实现。
要会提问题: 对事物/项目的了解要在有一定的认识后不断的提出问题、找答案,在这个过程中才会有更深的理解,如果提不出问题,只是一味地读代码,相信到现在我也分析不出个头绪。
阅读全文
摘要: 昨天和老婆在网上聊天,她看了我的博客,问我最近为什么不写技术文章了。我相信也是的,已经有2个星期没有写过技术类的文章。虽然最近忙着做 TrueLove 这个酒店查询的网站,但是在做 TrueLove 项目的时候一些经验、技巧、感悟和问题也应该记录下来,以便以后查阅和与他人分享。所以准备写 TrueLove 项目感悟的系列文章。
我是第一次用 Asp.net 2.0 做网站,所以很多地方都是摸索着来做。在项目感悟里面写的东西虽然都是自己应用的技术和方法,但是不保证他是最好的或者是正确的。很多自己的观点在里面,希望大家多指正以下。我下面先来帖以下这个项目要实现的功能,以便让大家对这个项目有所了解。
阅读全文
我有一个方案,但不知道存在的问题,优点我知道。
请大家参考。
先发代码。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
namespace VS2005ConsoleTest
{
class Program
{
static void Main(string[] args)
{
int status1 = 0;
int status2 = 0;
int status3 = 1;
Books books = new Books();
books.GetBooksData(int.Parse(status1.ToString() + status2.ToString() + status3.ToString()));
}
}
class Books
{
System.Data.SqlClient.SqlConnection sqlConn;
public Books()
{
sqlConn = new SqlConnection("Data Source=(local);user id=sa;password=123;Initial Catalog=Test");
sqlConn.Open();
}
public void GetBooksData(int condition )
{
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.CommandText = "select * from Books where classone|classtwo|ClassThree=" + condition.ToString();
sqlCommand.Connection = sqlConn;
using (SqlDataReader reader = sqlCommand.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["BookTitle"].ToString() + " " + reader["ClassOne"] + " " + reader["ClassTwo"] + " " + reader["ClassThree"]);
}
}
Console.Read();
}
}
}
创建TEST数据库。
CREATE TABLE [dbo].[Books] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[BookTitle] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ClassOne] [bit] NULL ,
[ClassTwo] [bit] NULL ,
[ClassThree] [bit] NULL ,
[IsTop] [bit] NULL ,
[IsPassport] [bit] NULL
) ON [PRIMARY]
GO
程序员.JACKY(48327206) 20:41:00
创建表。
INSERT INTO Books
(BookTitle, ClassOne, ClassTwo, ClassThree, IsTop, IsPassport)
VALUES ('ASP.NET程序设计', 1, 0, 0, 1, 1)
INSERT
INTO Books(BookTitle, ClassOne, ClassTwo, ClassThree, IsTop, IsPassport)
VALUES ('.NET FRAMEWORK精解', 1, 0, 0, 0, 1)
INSERT
INTO Books(BookTitle, ClassOne, ClassTwo, ClassThree, IsTop, IsPassport)
VALUES ('摄影广告', 0, 1, 0, 1, 1)
INSERT
INTO Books(BookTitle, ClassOne, ClassTwo, ClassThree, IsTop, IsPassport)
VALUES ('摄影技巧', 0, 1, 0, 1, 0)
INSERT
INTO Books(BookTitle, ClassOne, ClassTwo, ClassThree, IsTop, IsPassport)
VALUES ('中国万年历', 0,0, 1, 1, 0)
填入值。
这样的方式,请大家有兴趣的可以试试。
我觉得效率上可以再度优化,但保证了灵活性。
classone|classtwo|ClassThree
不管你填什么值,都可以匹配。
必竟是以010101010这样方式取匹配的值,某种意义上说,AND 和 OR 可以通用。
摘要: 基于mygosuMenu改版的.net菜单控件,可以轻松实现无限级,使用起来很方便,有源码下载,需要的朋友可以看一下。。。
阅读全文
摘要: Activities是工作流模型的一个可执行单元,它可以被重用,也可以把多个Activities整合成一个Activities。一个工作流可以由多个Activities组成,一个Activities也可以由其他的Activities构成,最终,每个Activities都作为一个可执行单元的形式表现出来。这次,我们来学习创建一个简单的Activity。
Activities是一个其实类,我们可以为其编写属性,方法和事件----这些属性方法和事件引用自workflow。我们还可以创建Activity并部署到.net程序集中来重用。
先看第一个:
使用activity设计器创建一个合成的定制activity
阅读全文
【
标题】博客园之经典文章
【
目的】本人2006年11月在此开博,博客园陪我走过了近三个月,从中我学习到了很多的东西,使我受益匪浅。由于能力有限,现在还处于只是“索取”,不能“付出”的阶段。
在学习的过程中发现了很多经典的文章(只代表个人的观点),本人想为博客园的网友做事,在这里把经典的文章按系列分类整理出来。不知道,这样做是否有点多余,大家给点建议和意见?
文章类别:
1、Web 开发/.NET
2、数据库
3、网络安全
4、软件工程与CMM
5、开发工具
6、操作系统
7、TCP/IP协议
8、互联网
整理的内容包括:
1、原文的作者
2、文中精彩的段落
3、网友评论的汇总
4、个人实践与理解总结
5、与其它技术的比较
摘要: 通过修改窗体设计器生成的代码,可以提高 .NET Compact Framework 1.0 应用程序的窗体加载性能。
阅读全文
摘要: 如果需要使用JavaScript更新UpdatePanel,以前往往会使用JavaScript来模拟Trigger的触发。我们往往会将一个按钮设为某个UpdatePanel的Trigger,然后在客户端模拟它的点击,使UpdatePanel进行更新。但是这样的做法实在太麻烦了些,也相当的不优雅。现在我们就来编写一个组件解决这个问题。
阅读全文
More Posts
Next page »