Edi Wang

Microsoft MVP for Azure

All Posts

如何让应用程序要求以管理员身份运行(C#)

从Windows Vista开始,为了防止操作系统被恶意软件破坏,Windows加入了UAC机制,在没有关闭UAC的时候,用户的程序都没有管理员权限去执行。但是如果软件需要做一些操作,比如读写注册表,就需要以管理员身份启动。然而普通用户并不清楚这一点,这有可能导致我们的程序被差评。幸好,用.NET开发的程序可以很方便的做到自动要求以管理员身份运行。首先为了达到演示效果,我需要在程序界面上通知当前环境是不是以管理员身份运行,为此我找了一个UACHelper,这个东西挺实用的,就算不是以管理员身份运行的,也不会在用户面前直接爆掉。
C# Windows UAC

巧用委托简化重复代码

在C#编程中通常会碰到许多重复劳动的情况,而面向对象编程的原则就是消除这些重复劳动,增加代码重用性。我们虽然有很多基本的模式去做抽象和封装,但还是会碰到一些看似不得已的重复劳动的情况。比如你在写一个数据访问层的类,按照规范,每个方法都需要加try-catch,就像这样: public void Method1() { try { // logic... } catch (DataException ex) { // fuck the ex... } } public void Method2() { try { // logic... } catch (DataException ex) { // …
C# lambda Delegate

Windows Phone 8 列表控件(LongListSelector)分组

Windows Phone 8的列表控件天生支持分组,就像人脉应用中的类似,可以快速根据拼音首字母定位。在列表视图中点击分组标题后显示所有的组名,点击组名即可定位到这个组。我们自己开发的WP应用也能做到这样的分组功能,但需要一些额外的代码。下面的例子来自我的一个WP应用,有图有真相: 分组视图: 实现LongListSelector分组其实很简单。 1. 首先,你需要一个分组的助手类,这是一个相对标准的类,MSDN上抄来的: public class Group : List { public Group(string name, IEnumerable items) : base(items) { this.Title = name; } public string Title { …
Windows Phone

Azure Blob Storage 编程简单入门

Microsoft Azure上的Storage服务看起来非常牛逼,它是用来在云端存储数据和文件的服务,比如Azure里的虚拟机就是保存在Storage中的。当然我们可以用Storage做更多的事,比如有些数据并不适合存放在关系型数据库中,就像图片和附件,我们就可以使用Storage服务。 今天介绍的是Storage里的一种,Blob Storage。Windows Azure Storage还有其他两种存储:Table和Queue,但是我只开荒过Blob Storage,所以其他两个就只能以后介绍了。 使用Blob存储首先得建立一个Storage Account,Account中包含的是Container,这类似于文件夹,最后你的文件会存放在Container下,也就是Blob。 它们的关系就像这样(可耻的盗用了一张Azure官网的图片) …
Azure Blob Storage

EntityFramework中使用.Include()做饥饿加载可能产生的性能问题

这几天在码新版博客程序,因为文章表字段太多,手贱把几个相关列拆分到了1-1的表中。比如Post 1-1 PostPublish,Post 1-1 PostExtension。但是性能突然比以前差了一点。 和这两张相关表直接交互的是这么一段代码: var query = Repository.Select().Include(p => p.PostExtension).Include(p => p.PostPublish) .Where(p => p.PostPublish.IsPublished && (authorName == null || String.Compare(p.Author, …
Entity Framework SQL Performance

How to Change TFS Server URL in Visual Studio

今天又给大家带来一个实用装逼技巧。这个故事的起因是我无意中发现微软的TFS Service支持URL重命名了,非常牛逼,就像这样: 但带来的问题就是我们需要手动更改以前所有使用这个TFS地址的地方。Visual Studio就是首当其冲的了。很可惜,在VS里面,是没有办法直接编辑TFS地址的。 如果删掉重建的话,还需要把之前所有的本地文件夹都映射一遍,万一玩脱了就爆了。所以还是建议去注册表手动修改。 要修改的位置是: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\TeamFoundation\Instances (如果你用的是VS2010,就把11.0换成10.0) 第一处:定位到原TFS地址的文件夹,把右边的Uri字段改掉。 第二处: 还有有个很阴巴的文件夹,藏在你的TFS文件夹下面,展开TFS文件夹,在 …
TFS Visual Studio

如何手动将一个普通.NET类库转换成可移植类库(Portable Class Library)

可移植类库是.NET程序员装逼的必备良药,至于它有多牛逼,我也不知道,大家可以自己看一下 http://msdn.microsoft.com/en-us/library/vstudio/gg597391%28v=vs.110%29.aspx 但是万一你装逼的时候手一滑,建成了一个普通的Class Library肿么办?普通青年的做法是删掉再建一个,这当然是OK的。但是,作为文艺青年,我们可以继续装逼:自己动手把这个类库转换成Portable Class Library。 为了演示,我先建一个普通的.NET类库:AVeryNBClassLibrary 在这个项目的属性页里面,自然是看不到Portable Class Library的选项的。 接下来,在项目上点右键,选择Unload Project,然后再次右键选择Edit AVeryNBClassLibrary.csproj。细心的观众 …
.NET

如何在Windows Azure虚拟机上配置外网能访问的FTP服务器

昨天打算用Windows Azure VM建个FTP来下东西,本来以为只要配置IIS和防火墙再打开Azure Portal的21端口就行的,结果又被Windows Azure爆出了翔。在Azure上配置FTP没那么容易的。 首先,如何安装和正常配置一个FTP我不叙述了,大家可以自己搞定。Azure唯一特殊的就在于开防火墙端口。 1. 你需要知道你VM的外网IP,可以用ping命令,虽然Azure VM不允许被ping,但解析IP还是没问题的。 2. 将IP添加到FTP站点的FTP Firewall Support里面。 3. 由于Data Channel Port是在IIS Root Node上被锁住的,所以还要回IIS Root去配端口范围。这些端口是FTP用来传输数据的(FTP居然不是只用21端口的,虽然不知道是为什么
IIS VM FTP

Windows Azure中如何将SQL数据库转移到别的Subscription下

今天怀着无比兴奋的心情,去参加了微软在上海举办的Azure训练营活动。又得到了一个Azure账户,并且也感受到了人类的希望。自从用了Azure以后,我逼格提升了,博客服务稳定了,就连三观也恢复了!妈妈再也不用担心HTTP 503了! 拿到新账户以后,我把Co-Administrator交给了我outlook.com上的的主账户。这样我用outlook账户登录,就能看见除了猿来的MSDN Subscription以外的另一个账户了。并且可以在一个账户中集中管理所有的内容,屌炸天了!#微软,人类的希望# 那么,在实际场景中,不同的Subscription可能是不同的人持有的,如果我们想把现有账户中的Azure Service转移到别的账户中,肿么办呢?如果重新部署的话,意味着风险和服务中断。幸好,光荣、伟大、正确的微软已经给我们提供了这么一个选项,能够在几秒内平稳将服务迁移到别的
SQL Azure Azure Subscription

使用PowerShell操作Windows Event Log

PowerShell是个很牛逼的命令行工具,在Windows 7以后的系统里都默认自带。学会了PowerShell就可以提升逼格,让妹子崇拜。今天就教大家用PowerShell操作Windows的Event Log。 首先,启动PowerShell很简单,只需要在开始菜单里输入Power,就能找到了(Windows 8用户可以直接在开始屏幕里搜索Power)。 启动PowerShell后,你可以看到一个这样的界面。和CMD不同,它是深蓝色背景的,并且路径前多了PS前缀。看起来很厉害的样子: 有用程序写过Windows Event Log的童鞋都知道,我们的首要任务是创建一个Log和一个Source。PowerShell里语法如下: new-eventlog -LogName 日志名称 -Source 源名称 比如,我们创建一个Name为Game,Source为CS的Log,可以这样写: …
Windows PowerShell EventLog