fuyun

博客园 首页 新随笔 联系 订阅 管理
  16 Posts :: 1 Stories :: 40 Comments :: 1 Trackbacks

2007年12月8日 #

 

    Windows Live Writer 代码高亮语法插件Syntax Highlight支持10多种语言的代码加亮,使用起来非常
方便,不过唯一有个缺点,代码中的中文会乱码。这个工具是个开源项目,本身所使用的语法加亮库也是开源的。
打开代码发现乱码是因为语法加亮库Wilco.SyntaxHighlighter.dll中RTF格式中没有中文字体的原因。现在将
修改好的插件发布上来供大家使用,包含源代码。

1、界面

image

2、效果

static class Program
            {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            }
            }

 

源码下载:Highlight4Writer.rar

插件下载:SyntaxHighlight.rar

posted @ 2007-12-08 14:24 浮云 阅读(692) | 评论 (10)编辑

2007年12月7日 #

     使用SVN进行源代码版本控制时,我们希望能够快速找到每个发布版本对应的源代码版本,现在可以通过在程序集的版本信息中增加SVN源码版本信息的方式来实现我们的要求。
      现在我们定义每个程序集的版本信息的最末段表示SVN的源码版本。详细定义如下:

程序集版本号分为4段,例如1.0.4.23。

  1. 第一段为主版本号,项目一但启动则不会更改。
  2. 第二段为次版本号,在项目功能做较大调整时增加,增量为1。
  3. 第三段为修订版本号,通常在解决缺陷或者细微功能变化时增加,增量为1或者2。该版本号分奇数和偶数两种。奇数表示测试版本,偶数表示稳定版本。
  4. 第四段为SVN源码版本号,该版本号通过脚本自动生成。
     使用脚本自动生成SVN版本号的先决条件:
  1. 安装TortoiseSVN;
  2. 源代码在SVN版本管理控制之下。
    修改项目设置,使之能够自动生成版本号:
  • 修改Properties\AssemblyInfo.cs文件,将程序集版本信息的最末一段改为$WCREV$。并增加一行"//最后发布时间:$WCDATE$"
例如:
[assembly: AssemblyVersion("1.1.0.$WCREV$")]
[assembly: AssemblyFileVersion("1.1.0.$WCREV$")]
//最后发布时间:$WCDATE$
  • 将AssemblyInfo.cs文件重名为AssemblyInfo.tpl,并添加到源代码管理。
  • 从源代码仓库中删除AssemblyInfo.cs,并排除它,使其不受版本管理
  • 添加本文中的GenerateAssemblyInfo.bat文件到Properties目录中,并添加到源代码管理。
  • 修改项目属性,在生成事件预生成事件命令行中添加以下命令。
"$(ProjectDir)\Properties\GenerateAssemblyInfo.bat" "$(ProjectDir)" .\Properties\AssemblyInfo.tpl .\Properties\AssemblyInfo.cs
     注意
  • 编译之前记得提交你的更改和更新别人的更改,这样才能确保版本号的正确。
  • 今后要对程序集信息进行修改时,请对AssemblyInfo.tpl文件进行修改。
  • 如果生成的AssemblyInfo.cs文件出现中文乱码,打开AssemblyInfo.tpl,在文件->高级保存选项中将文件编码改为UTF-8即可。

     脚本

GenerateAssemblyInfo.bat

 

      参考资料 Zealic 的 通过 TSVN 自动更新程序集版本信息 
 

posted @ 2007-12-07 14:29 浮云 阅读(2669) | 评论 (5)编辑

2007年10月19日 #

刚开始学习MonoRail的时候,一直搞不清楚URL与调用的Controller是如何对应了,经过一番实验分析后,得出以下结论。 

一个http请求是与如何工作的呢?请看以下实例,我们将浏览器发出的请求URL分层四段。

http://localhost/guestbook/user/admin/index.castle

              1       2        3      4


第一段“guestbook/user”由Controller的ControllerDetails Attribute决定,设置为Area属性为“guestbook/user”的Controller才有可能会被调用。

第二段“admin”决定系统会调用AdminController类,类的Namespace和大小写与此无关。但是 ControllerDetails的Area属性必须匹配才行。该值的大小写无关。

第三段“index”决定系统会调用GuestBookControllerIndex公共方法,该值与大小写无关。

第四段“castle”是由web.config配置文件决定的,在<system.web/><httpHandlers/>配置节中,MonoRail需要添加以下配置才能正常工作。其中“path”决定了访问URL的扩展名,这里我们设置的是“*.castle”,你可以修改为你喜欢的名字。不过你想设置在IIS中配置过的名称比如“*.html”,就需要修改IIS配置了。

Web.config <system.web/><httpHandlers/>节中的MonoRail配置项:

<add verb="*" path="*.castle" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" />

GuestBookController类:


[ControllerDetails(Area = "guestbook/user")]
public class AdminController : Controller
{
      
public void Index()
      
{
      }

}

引申问题,如果请求http://localhost/guestbook/index123.castle这样的路径,由于GuestBookController没有Index123这个方法,当我们调用一个不存在的公共方法时会出现异常。希望通过友好的方式显示错误信息或者重定向到另一个存在的页面时,可以使用[DefaultAction()]来描述GuestBookController类。

[DefaultAction()]
public class GuestBookController : BaseController
{
    
public void DefaultAction()
    
{
    }

}

http://localhost/guestbook/index123.castle会调用DefaultAction()方法。

或者

[DefaultAction("Index")]
public class GuestBookController : BaseController
{
    
public void Index()
    
{
    }

}

http://localhost/guestbook/index123.castle会调用Index()方法。


现在还没有解决的问题,调用http://localhost/index.castle这样的URL会出异常。不知道那位朋友知道如何解决,请告知。

经过一番Google,终于找到实现调用http://localhost/index.castle这样的路径的方法了。在web.config monorail配置节中,增加defaultUrls的配置即可。

    <monorail smtpHost="yoursmtphost" useWindsorIntegration="false">
    
<defaultUrls>
      
<add url="index.castle" controller="guestbook" action="index" area="" />
    
</defaultUrls>

如果希望http://localhost/也能正常访问的话,有个简单的办法,在网站根目录下建立一个default.aspx文件。内容如下:
<%@ Page Language="C#" %>
<script runat="server">
  protected override void OnLoad(EventArgs e)
  {
    Response.Redirect("/index.castle");
    base.OnLoad(e);
  }
</script>
posted @ 2007-10-19 21:09 浮云 阅读(2169) | 评论 (15)编辑

2007年10月18日 #

在研究MonoRail过程中进行了URL重定向的实验。未全面了解MonoRail的情况下,首先尝试使用ASP.NET经典方式,参考Microsoft一篇文章《在ASP.NET 中执行URL 重写》,创建UrlRewriteModule类并实现IHttpModule接口来达到我的要求。在实现该功能的同时,我将URL重定向的配置文件重Web Config中移除来,单独建立了一个URLRewriting.config的文件进行管理。

UrlRewriteModule类工作流程

初始化
public void Init(HttpApplication context)
{
    
try
    
{
        LoadConfig(HttpRuntime.AppDomainAppPath 
+ "UrlRewriteRule.config");
    }

    
catch (Exception ex)
    
{
        
string message = "加载Url Rewriting 配置文件失败。";
        Debug.WriteLine(message);
        Debug.WriteLine(ex.Message);
        
throw;
    }


    context.BeginRequest 
+= new EventHandler(context_BeginRequest);
}

读取配置
private void LoadConfig(string path)
{
    XmlDocument doc 
= new XmlDocument();
    doc.Load(path);

    
if (processors == null)
        processors 
= new List<UrlRewriteProcessor>();
    
else
        processors.Clear();

    
string lookFor, sendTo;
    
foreach (XmlNode node in doc.SelectNodes("urlRewriting/rules/rule"))
    
{
        lookFor 
= node.SelectSingleNode("lookFor/text()").Value;
        sendTo 
= node.SelectSingleNode("sendTo/text()").Value;

        
if (!String.IsNullOrEmpty(lookFor) && !String.IsNullOrEmpty(sendTo))
            processors.Add(
new UrlRewriteProcessor(lookFor, sendTo));
    }

}

通过XmlDocument直接读取XML内容,实际易用中这里必须要对配置文件进行监视,内容改动以后需要重新加载。
配置文件结构
<?xml version="1.0" encoding="utf-8"?>
<urlRewriting>
  
<rules>
    
<rule>
      
<lookFor>/guestbook/(\d+)/delete\.castle</lookFor>
      
<sendTo>/guestbook/delete.castle?id=$1</sendTo>
    
</rule>
    
<rule>
      
<lookFor>/guestbook/(\d+)/(\d+)/test.castle</lookFor>
      
<sendTo><![CDATA[/guestbook/test.castle?year=$1&month=$2]]></sendTo>
    
</rule>
  
</rules>
</urlRewriting>
lookFor为需要重定向的源地址格式正则表达式,sendTo为重定向目标地址。这里配置了删除留言的URL重定向。
例如原来删除ID=2的留言记录URL路径为http://localhost/guestbook/delete.castle?id=2。现在可以写成http://localhost/guestbook/2/delete.castle

分析路径进行
private void context_BeginRequest(object sender, EventArgs e)
{
    HttpContext context 
= HttpContext.Current;

    
if (processors != null)
    
{
        
foreach (UrlRewriteProcessor processor in processors)
        
{
            
if (processor.Process(context))
                
break;
        }

    }

}
浏览器的请求都会经过context_BeginReqeust方法,在这里分析请求的路径。UrlRewriteProcessor读取配置文件中的正则表达式过滤请求的路径,对满足条件的进行重定向。
该方法条用非常频繁,所使用的正则表达式预先编译好,存放在UrlRewriteProcessor类中,UrlRewriteProcessor类实例集合为UrlRewriteModule类的静态成员。
private static List<UrlRewriteProcessor> processors = null;

URL重定向
        public bool Process(HttpContext context)
        
{
            
if (regex.IsMatch(context.Request.FilePath))
            
{
                
string newUrl = regex.Replace(context.Request.FilePath, sendTo);
                context.RewritePath(newUrl);
                
return true;
            }

            
else
            
{
                
return false;
            }

        }

使用正则表达式对符合条件的URL进行参数替换以后,调用ASP.NET的HttpContext.RewritePath(string url)方法就完成了URL重定向功能。

web.config中进行配置
要使URL重定向生效,还必须将UrlRewriteModule配置到系统中才能行。
在web.config中<system.web/>/<httpModules/>加入以下代码。
<httpModules>
    
<add name="urlRewriting" type="Lanjian.GuestBook.UrlRewriteModule, GuestBook" />  <!-- 这儿是为URL重定向而增加的配置 -->
  
<add name="monorail" type="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework" />
</httpModules>
注意我们的URL重定向HTTPModule在配置文件中,必须放在monorail之前,否则不能生效。

今天在GSpring 发表的《MonoRail学习笔记三:使用方便功能强大的routing功能》文章中了解到,MonoRail框架中的routing已经实现了该功能。
配置方法可以参考GSpring的文章。

总结

使用MonoRail框架时,URL重定向可以使用你以前习惯的或者是现有的HTTPModule模块进行处理,或者使用MonoRail的routing。参考源代码,二者实现思路是完全一样的。
同时也要注意,URL重定向配置项必须放在monorail之前。

项目截图:


本文的完整代码可以在这儿下载。
posted @ 2007-10-18 22:38 浮云 阅读(326) | 评论 (0)编辑

2007年10月17日 #

关注MVC开发Web应用程序是看到《一个.NET的MVC Web框架》这篇文章以后开始的,通过官方网站的几个教程很快引起了我的兴趣,的确是非常简洁,让我想起了ASP的时代。再搜索了一下ASP.NET MVC框架,发现MonoRail相对来说文档较多一些,决定从它开始。最近一段时间微软要推出ASP.NET的MVC框架新闻各大技术网站都在转,博客园针对MonoRail的文章也多了起来。使用ASP.NET WebForm开发的经验不是很多,所以学习MonoRail显得更容易一些,没有固有的思维方式限制,这对我是个有利的一面。

准备

学习MonoRail的一些参考资料:

Velocity 《VTL语法参考指南》中文版
MonoRail在View一层提供了多种Render引擎,貌视NVelocity的最多。它语法应该和Velocity是一致的(未考证)。

prototype.js 1.4版开发者手册
如果要使用AJAX技术的话,对这套JS库有所了解对你非常有帮助,MVC模式下可没有Update Panel使用了。

MonoRail中的ajaxHelper入门
看了这篇文章以后才知道AJAX其实和MonoRail MVC框架没多大关系,要想用好AJAX应用还是得了解prototype.js这些库。

先看看博客园两位朋友的文章,入门还要更快一些。
一是YokMonoRail专栏
二是福娃 的 MonoRail学习-介绍篇

另外MonoRail的官方网站http://www.castleproject.org/是必须要去的。

实战

在官方网站下载安装包安装好以后,就可以使用VS2005开始工作了,具体方法还是参考上面两位朋友的文章吧。
通过两个晚上的摸索,对MonoRail有了大致的了解。通过编写了一个留言簿的实战,明白了如何在MonoRail上实现以下技术和一些细节。
1、三层架构应用
2、AJAX应用
3、Url Rewriting
4、Model、View、Controller分别建立Project,在大中型项目中这是必不可少的。

现在还没有搞清楚的事情和下一步要做的实验:
1、多层目录结构如何与Controller对应;
2、表单验证是否有更方便的实现方式,现在使用prototype.js可以进行验证,不过内容仍然提交到服务器上了。
3、如何进行View嵌套,现在只是通过ShareView的方式共享。
4、View目录中的模板使用的图片、CSS等文件放在那儿合适。现在的问题是放在网站目录下编辑时看不到效果,放到View目录下不利于发布。
5、如何方便的对网站换肤,还有待进一步实验。

希望我能坚持把这次学习过程记录下来。
项目截图:

把这次实践的源码发上来,希望对学习MonoRail的朋友有所帮助。

 * 昨天晚上发布的代码中未包含NVelocity引擎库,现在已经加上。请需要的朋友重新下载。
下载:http://www.cnblogs.com/Files/fuyun/GeustBook.rar

posted @ 2007-10-17 22:58 浮云 阅读(849) | 评论 (6)编辑

2006年4月29日 #

.Net 2.0为提供的ListView控件和1.1提供了分组和平铺视图两个新功能。这些功能需要在Windows XP或者Windows 2003上面才能表现出来。

效果图如下:

再Windows2000下面除了显示效果和以前一样以外,今天还发现下面这个问题。ListViewGroup.Count属性不会随ListView.Items.Clear()方法影响。

ListView listView = new ListView();
ListViewGroup localGroup 
= new ListViewGroup("本地用户");
listView.Groups.Add(localGroup);

ListViewItem item 
= new ListViewItem("张山", localGroup);

// 此时 localGroup.Items.Count 等于 1

listView.Items.Clear();

// 此时在Windows XP、Windows 2003环境下
// localGroup.Items.Count 等于 0
//
// 而在Windows 2000 环境下
// localGroup.Items.Count 仍然等于1。
posted @ 2006-04-29 23:01 浮云 阅读(652) | 评论 (2)编辑

2006年4月8日 #

组件的一些公共属性不希望被VS在设计时加到InitializeComponent()方法中怎么处理呢?我试过了,将属性加上[Browsable(false)]也不行。
我的代码如下:
    /// <summary>
    
/// 控制器通讯类型下拉列表框。
    
/// </summary>
    public class CommunicationTypeComboBox : ComboBox
    {
        
/// <summary>
        
/// 构造列表框实例。
        
/// </summary>
        public CommunicationTypeComboBox()
        {
            Items.Add(
"串口");
            Items.Add(
"TCP");
        }

        
/// <summary>
        
/// 获取列表框中的所有项。
        
/// </summary>
        [Browsable(false)]
        
public new ObjectCollection Items
        {
            
get { return base.Items; }
        }
    }
 
将控件放到窗体上,VS回自动在InitializeComponent()方法中加入一下代码。粗体部分。
 
            // 
            
// cmbCommunicationType
            
// 
            this.cmbCommunicationType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            
this.cmbCommunicationType.FormattingEnabled = true;
            
this.cmbCommunicationType.Items.AddRange(new object[] {
            
"串口"
,
            
"TCP"
});
            
this.cmbCommunicationType.Location = new System.Drawing.Point(12466);
            
this.cmbCommunicationType.Name = "cmbCommunicationType";
            
this.cmbCommunicationType.SelectedItem = Xunmei.Door.CommunicationType.SerialPort;
            
this.cmbCommunicationType.Size = new System.Drawing.Size(12120);
            
this.cmbCommunicationType.TabIndex = 2;
            
this.cmbCommunicationType.SelectedIndexChanged += new System.EventHandler(this.cmbCommunicationType_SelectedIndexChanged);
 
随着编辑次数的增会变成这样。除了不在构造函数中增加项以外,有没有办法解决这个问题?
 
this.cmbCommunicationType.Items.AddRange(new object[] {
            
"串口",
            
"TCP",
            
"串口",
            
"TCP",
            
"串口",
            
"TCP",
            
"串口",
            
"TCP",
            
"串口",
            
"TCP"}
);
 
经过几天的努力终于找到了DesignOnlyAttribute 类

指定某个属性 (Property) 是否只能在设计时设置。

通过将 DesignOnlyAttribute 设置为 true 进行标记的成员只能在设计时进行设置。通常,这些属性 (Property) 只能在设计时存在,并且不对应于运行时对象上的某个实际属性 (Property)。

没有属性 (Attribute) 或通过将 DesignOnlyAttribute 设置为 false 进行标记的成员可以在运行时进行设置。默认为 false

将CommunicationTypeComboBox的Items属性加上DesignOnlyAttribute 就可以完美解决该问题。

        /// <summary>
        
/// 获取列表框中的所有项。
        
/// </summary>
        [DesignOnly(false)]
        
public new ObjectCollection Items
        {
            
get { return base.Items; }
        }
        
        另一个链接

posted @ 2006-04-08 16:01 浮云 阅读(593) | 评论 (2)编辑

2006年3月18日 #

Coding4Fun:是你吗?为超炫的 USB 硬件编写更好的软件

 

发布日期: 2006-3-1 | 更新日期: 2006-3-1

Scott Hanselman
Corillian Corporation

本文中的代码
讨论本文
打印版本

注:该项目的源代码仅仅是一个开始。在 SourceForge 中,该代码会进一步发展。访问该站点,获得指导代码演变的帮助或下载 .NET Framework 2.0 或 1.1 的最新版本。

*
本页内容

硬件 硬件
与 USB 进行的交互和一些抽象 与 USB 进行的交互和一些抽象
消灭 Bug、阅读手册 消灭 Bug、阅读手册
特定于用户的设置 特定于用户的设置
使用插件扩展应用程序(任何语言!) 使用插件扩展应用程序(任何语言!)
小结 小结

摘要:在“Some Assembly Required”专栏的第四期中,Scott HanselmanBryan Batchelder 发现了一个非常吸引人的硬件,但是它附带的软件却非常糟糕,以至于他们使用 .NET Framework 2.0 编写了自己的软件。您可以从一些在线零售商那里购买一个由无签名公司制造的带有 USB 接收器的小型无线 key fob(它被称为“无线 USB 安全设备”),这意味着可以在离开时锁定计算机,在返回时取消锁定。但是,它附带的软件很糟糕。因此,我们策划了“一些必需的程序集”。(希望该公司的相关人员会阅读这篇文章并开始使用我们的软件!)我们还将使用以 Visual Basic 编写的一些插件,通过全新的功能来扩展应用程序!

硬件

这是一个多么奇特的主意!将一个浅绿色按钮(在 NewEgg 只需 15 美元就能买到)系到您的钥匙圈上。它变身为您计算机的一个“存在”指示器。您到了,它知道;您离开,它也知道。它能够执行诸如锁定计算机、调低音量或运行特定任务这样的操作。棒极了,是吗?并非如此。在 1995 年左右,硬件功能已经很好了,但附带的软件却是古怪的小程序,“锁定”计算机不过是使用它自己的非标准大窗口来覆盖用户所有的应用程序,并强制用户输入密码来去掉这个窗口。不,这不是您的 Windows 登录密码,而是另一个完全不同的特定于应用程序的密码。天啊!


而且,这个小程序不能以任何方式扩展,看起来也没有包含任何 COM 或 .NET 库以轻松地接收设备事件。但是,这个主意 和这块硬件真是太吸引人了,我和 Greg Hughes 已经多次讨论过如何为这个