2009年6月5日

使用 MyMeta 组件获取数据库结构

    MyMeta 组件是代码自动生成工具 MyGeneration 的核心模块之一,主要负责定义和获取关系数据库结构。在 MyMeta 中定义了一套比较完整的关系数据库对象结构,并提供获取(反向工程)这些对象的方法。使用 MyMeta 能轻松地获取到数据库中大部分类型的对象的元信息,这些对象包括架构(Schema)、表、视图、存储过程、索引、列、主键、外键、存储过程参数等,虽然关系数据库中的对象类型不止这些,但对我们一般的软件开发来说,这些信息足够了。另外 MyMeta 还支持了足够多的关系数据库类型,可以说市面上能见到的数据库系统都支持了,包括MS Access、MS SQL Server、Oracle、MySQL、DB2、Firebird、PostgreSQL、Pervasive、SQLite、VistaDB 等,并且可灵活扩展。当然,MyGeneration 全部开源,这也是我最终决定在项目中使用 MyMeta 的重要原因。

    MyMeta 的使用方法也非常简单,项目中添加对 MyMeta.dll 的引用后,用如下几行代码即可获得整个数据库的结构:

Code

    MyMeta.dbRoot 是使用 MyMeta 时最重要的类型之一,是访问数据库对象的根,所有的数据库架构(Schema)对象都可以通过 dbRoot.Databases 集合访问到。

    我在使用的过程中发现两个问题,一是 dbRoot 的 ShowDefaultDatabaseOnly 属性似乎不起作用,不管设为 true 还是 false,每次都是获取到登录用户有权限看到的所有数据库;二是连接 MS SQL Server 时,无法获取视图中列的说明信息,即列的扩展属性 MS_Description 的值。这两个问题从源码中跟踪调试的情况来看,应该属 bug,在修改了相关源码并重新编译后,运行正常。
 
MyGeneration 官网:http://www.mygenerationsoftware.com/portal/default.aspx
 
选型过程:
    最近的一个项目中有获取数据库元信息的功能,要求不高:获取表和视图的列信息,包括说明信息(Oracle 中的 comment,SQL Server 中 MS_Description);支持多种类型数据库。我马上想到了网上众多的代码自动生成工具,获取数据库元信息是代码自动生成工具的必备功能,我只用这一点就行。在下载试用了 CodeSmith、CodeMaker、CodePlus、Nowind.EnterpriseORM 和 MyGeneration 后,从复用数据库元信息获取组件的角度看,前四个有的要许可,有的支持数据库类型少,有的模块、层次划分不清晰不适合复用,最终选择了 MyGeneration 的 MyMeta。其实从名气上来说 CodeSmith 是最大的,它提供这个功能的组件叫 SchemaExplorer,结构设计非常合理,扩展性也很强,本打算用了。但后来发现其不支持说明信息,对 Oracle 的支持也不够,竟然不支持视图,而且最新版本需要注册才能用,弃之。
posted @ 2009-06-05 21:35 阳春三月 阅读(63) | 评论 (0)编辑

2009年3月9日

    从一直在 Oracle 上做工作转到用 SQL Server,有些使用习惯还转不过来,最明显的就是习惯了键盘敲命令,现在得用鼠标双击拖拽窗口,比如以前一个“desc” 命令就可以列出表的结构,现在得鼠标左键右键点选半天才能看到。虽说图形管理界面简单直观易上手,但对我来说,还是喜欢命令行,喜欢脚本操作。
    不过喜欢归喜欢,新东西该学还得学,该适应还得适应。从 Oracle 的经验知道,所有的数据库操作都可以用 sql 脚本完成,大到建一个数据库,小到改一个字段的值,sql 无所不能。MS SQL Server 2005 中 SQL Server Management Studio 的出现,其易用性更上一层楼,但对 sql 命令的支持却也是毫不含糊的。上面提到的 desc 功能,可以用如下 sql 语句实现: 
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS where table_name='表名'
    这句话里面的“INFORMATION_SCHEMA.COLUMNS”是个“信息架构视图”,可以获取表的列信息,类似的视图还有INFORMATION_SCHEMA.Tables、INFORMATION_SCHEMA.Views、INFORMATION_SCHEMA.Schema 等等,分别能获取有关表、视图和架构的信息。信息架构视图是 SQL Server 2005 提供的几种获取元数据的方法之一。
    获取数据库的元数据信息在基于关系数据库的信息管理系统中是经常用到的功能,在 Oracle 中可以从系统预定义的所谓“字典表”或“字典视图”获取,比如“user_tab_columns”、“user_all_tables”等。上面我们说信息架构视图是 SQL Server 2005 提供的几种获取元数据的方法之一,那肯定还有别的方法,别的方法有哪些呢?
    查 MSDN 知,SQL Server 数据库中对象的结构和属性信息由 SQL Server 2005 系统目录提供。SQL Server 2005 系统目录的核心是一个视图集,这些视图显示了描述 SQL Server 实例中的对象的元数据。基于 SQL Server 的应用程序可以使用以下方式访问系统目录中的信息: 

    目录视图。建议使用这种访问方法。
    信息架构视图。
    OLE DB 架构行集。
    ODBC 目录函数。
    系统存储过程和函数。
    
    看,方法还不少呢!这些方法都有自己特定的使用环境和使用方法,比如:微软推荐使用的目录视图,内容最全最有效,DBA 用 SQL Server Management Studio 管理数据库时目录视图肯定是最常用的,而信息架构视图符合 SQL-92 标准,适合在异类数据库系统之间移植的应用;目录视图的名称都是以“sys.”前缀,信息架构视图必须以“INFORMATION_SCHEMA.”前缀等。
    目录视图的内容非常多,MSDN 中列出的包括 CLR 程序集目录视图、对象目录视图、数据库和文件目录视图等 16 个。而且视图间还有继承关系,像 sys.objects 是个基本视图,sys.tables、sys.columns 都是派生自 sys.objects 的派生视图。派生视图相比基本视图包含了更多的列,但因为是限制在某一方面的信息,所以行数一般要比基本视图少。另外,我们看到有些资料里获取列名查的是 syscolumns,注意这个“syscolumns”跟“sys.columns”还是有点儿区别的,syscolumns 是 SQL Server 2000 里的系统表,在 SQL Server 2005 里其功能已由 sys.columns 代替,但为保证向后兼容,SQL Server 2005 提供了自动将 SQL Server 2000 系统表映射到系统视图的功能。
    了解常用的系统目录表或系统字典,对学好 SQL Server 或 Oracle 这种大型 RDBMS 还是很有必要的,因为从这些表或视图中我们可以看出数据库后台的一些存储逻辑和管理机制,能帮助我们更深刻透彻地理解数据库,同时对提高数据库管理及开发的效率也都大有裨益。
    两种不同的 RDBMS 对比学习,把在一种 RDBMS 上已有的经验用于另一种,也许行得通,这是业内的通行做法;也许行不通,对这行不通的要仔细研究其差异,从机制上找到新的解决办法,然后由点及线,及面。所以说,对比学习也是种利用既有经验提高学习效率的好方法。
posted @ 2009-03-09 16:25 阳春三月 阅读(186) | 评论 (0)编辑

2009年3月6日

     自从 2003 年开始接触 .Net 编程,博客园我是每天都要去逛逛的。作为国内最有名气的专注于 .Net 开发的技术社区,我从博客园中受益匪浅。从去年开始,尤其是进入 2009 年后,我从博客园首页的帖子,和大家讨论的话题,隐隐感受到了一种气息,或者是一种形势,那就是我们中国软件人员的开发水平正在进入一个质的飞跃的时期。以前讨论 .Net 开发的某一方面的技术问题,或是软件项目管理的问题,大家谈的都很零碎,就事论事,仅此而已。如果想系统学习某项技术,比较系统、全面的教材,都来自 MSDN 或微软 WebCast 这种官方渠道。但现在,我注意到由我们中国一线开发人员原创的技术教程、书籍开始纷纷登场,像《你必须知道的.Net》、《设计模式——基于C#的工程化实现及扩展》、《走出软件作坊》等。这些书不管是讲开发还是讲管理,都是紧扣实践,条理清晰,有深度,有广度,也许国外有很多经典,但这些才是真正适合中国程序员口味的好书。另外博客园还有很多讲某个专题的系列文章,也都是篇篇原创,价值非常大。
    我想这种高质量的教程书籍大量涌现的局面,也是个必然现象。中国 .Net 开发人员的成长,算来也有七八年了。七八年的时间,对于理解、掌握一个新的技术体系,并投之于实践,融会贯通,提炼升华,差不多刚好是一个周期。这一个周期之后,勤于钻研并善于总结的那些个中高人,如果再有一定的文字功力,该到收获的季节了,于是我们便看到了以博客园众多高手为代表的百花齐放的大好春光。
    这些教程书籍的大量出现,也从一个侧面反映了我们这个行业整体提高到了一个新的水平。行业的整体水平取决于从业人员的业务水平,看看这些书籍的作者,每一个都是技术高超、经验丰富的牛人,他们只是我们众多软件开发人员中的代表。虽然多数开发人员的水平没这几位高,但没有肥沃的土壤长不出丰收的庄稼,没有水涨船也不会高,看看博客园的精华区,默默无闻的牛人还是非常多的。
    在这里,我真的很感谢博客园,感谢 dudu,感谢那些奉献了众多精品的高手们,还有博文视点这个出版团队。虽然我资质有限,写的东西都不好意思让人看,但我会一直关注博客园,支持博客园。
posted @ 2009-03-06 15:15 阳春三月 阅读(106) | 评论 (2)编辑

2009年1月10日

    我们都知道事件是特殊的委托,特殊在哪儿?
    我只发现了一点,就是委托类型在初始化时可以用“=”,而事件只能是“+="。这使得事件处理程序只能一个个的往上挂,然后用”-=“一个个的注销,从而避免了委托的”=“一下子只赋为一个方法或赋为 null 而遭清空。这有用吗?有用。比如你开发组件的时候,某个业务对象的事件被触发,你想先在组件内部处理一下,处理完了再往外传,让组件调用方处理,这时你就得用 event 声明;如果只是声明为 delegate,则可能组件调用方一个“=”赋值,你的方法就没机会执行了。由此可见,如果可能会多次委托处理,应该声明为 event;只处理一次,delegate 就够了
    实际上 delegate 也可以用“+=”赋值,此时效果跟 event 一样。但谁敢保证调用方不会来个“=”呢!
    delegate 之所以也能“+=”赋值,是因为用 delegate 声明的委托实际是 System.MulticastDelegate 类型,叫多路广播委托,天生拥有多路广播的能力。
 
    注意,delegate 开头是小写的 d,如果换成大写开头的 Delegate,那差别可就大了,简直是孙子和爷爷的区别。为什么说是孙子和爷爷呢?因为 delegate 仅仅是 C# 的关键字,表示一个继承自 System.MulticastDelegate 的具体委托类,而 Delegate 却是  System.MulticastDelegate 的父类,这还不是孙子和爷爷吗。另外,Delegate 和  System.MulticastDelegate 都是抽象类,只有编译器才可以从此类派生。也就是说,除了用 delegate 这种形式,我们不能显式地从这两个类派生。
    关于 delegate 和 Delegate,我以前一直以为是一样的,就像 string 之于 String,bool 之于 Boolean,仅仅是个方便书写的别名。这次发现它们的区别,是在看王翔的新书《设计模式——基于C#的工程化实现》时。王翔说“delegate 声明的 Delegate 类型其实本身继承自  System.MulticastDelegate ”,我认为他说反了,寻思着给人家发个邮件指出一个 bug,没想到是我自己没弄清楚。
 
    最后感叹一下,王翔跟我同年同级,他海大物理系毕业,也算半路出家。同样毕业七年,人家都出书了,我还得努力啊。
posted @ 2009-01-10 19:00 阳春三月 阅读(162) | 评论 (1)编辑

2009年1月9日

    机子里装了好几个版本的项目数据库,想知道新的跟老的在库结构上有啥不一样。在网上搜了好几个小工具,要么不支持 Oracle,要么功能太弱,只能比较表,视图、过程、触发器等都不支持。正在郁闷中,突然,有位大仙的帖子映入了我跳动的眼帘——用 PLSQL Developer,Tools-Compare user objects!我马上打开 PLSQL Developer,Tools-Compare user objects,设置 target,然后 compare,我的妈呀!我简直太激动了!表、视图、过程、触发器、序列,不一样的都给我列出来了!而且,而且,简直不能让我相信的是——连更新脚本都替我生成好了,自动的,带注释的,老正确的!!!哎呀,我太太太佩服神奇的、伟大的 PLSQL Developer了。立马招来同事,以后咱们就用它干活了。
    想到曾经下了个最新的 7.1 版,还是汉化的,赶紧装上,换掉老的 5.1 版。哎呀,我的妈呀!我一眼又瞅见了 工具-比较表数据,连数据都可以比较!同样自动生成更新脚本,想直接对比执行更新都可以!
    PL/Sql Developer,牛!
 
关键词:PL/Sql Developer,比较数据库结构,比较表数据
posted @ 2009-01-09 16:59 阳春三月 阅读(203) | 评论 (1)编辑

2008年12月31日

博客太久没更新了,昨天一个几年没见的朋友告诉我还在看我的博客,说我写的好,很是惭愧!像我这种人,“博德”太差!

我用博客主要是记一些有意义的事儿,或是小的经验总结,怕时间长了自己忘了。但自从用上了EverNote 后,我便转移了战场——EverNote 实在好用。

2008年的最后一个夕阳也要下山了,告别多事的2008,迎来充满希望的2009,祝愿我所有的朋友、亲人新年快乐!

最后推荐几个很好用的小工具,算是送给各位的新年礼物吧。

1. 记笔记 EverNote,强力推荐!

随时记录,自动保存。

自动跟服务器同步。
从浏览器等外部程序方便粘贴图片、表格。
自定义标签。
飞速搜索。
备份,html、txt、xml等多格式导出导入。
方便的发送邮件。

开放 API,支持编程处理。

2. 桌面搜索 Everything,强力推荐!

小巧,飞速,相比于 Google 桌面搜索等动辄上 G 的索引文件,Everything 可以在几分钟内建立硬盘上几十万个文件的索引文件,且只有几个M。

只搜索文件夹、文件名,不能深入到 Office 文档或文本文件内部,但足够用了。

快就一个字!

3. 屏幕放大演示工具 ZoomIt,经常用 ppt 交流或上课者必备!

屏幕局部放大

彩笔划线标注
 
缺省快捷键
开启放大功能: Ctrl+1
连续放大、缩小: 鼠标滚轮或上下键
结束放大:Esc 或 鼠标右键
 
绘图:鼠标左键
删除上次画的实体:Ctrl+Z
删除画的所有图形:e
鼠标返回屏幕中心:空格键
结束绘图:鼠标右键
调节画笔粗细:Ctrl+鼠标滚轮或上下键
改变画笔颜色:r红,g绿,b蓝,y黄,p粉红,o橙
画特殊图形:直线按住Shift,矩形按住Ctrl,椭圆Tab,箭头Shift+Ctrl
进入白板状态 w,进入黑板状态 k
保存当前缩放的图形:Ctrl+S
只绘图不放大:Ctrl+2
 
绘图时按 t 可输入文字,但没试通。

Ctrl+3 进入时间模式,显示时钟。

 

 

 

posted @ 2008-12-31 17:12 阳春三月 阅读(64) | 评论 (2)编辑

    C# 中类的属性,编译成中间语言后是 get、set 两个方法,调用属性实际上是调用 get 或 set 方法。

    这一点刚接触 C# 时就学到过,但没往心里去。今天修改了项目类库中的一个类,把原来一个公共字段用一个同名可读写的属性实现。本来想着在其它调用这个字段的地方,因为调用属性和调用字段语法完全一样,名字也没变,代码是不用改的。但却发现程序运行不了,提示找不到原来的那个字段。用 ildasm 打开新的程序集文件一看,顿时明白了怎么回事儿:属性的实质还是方法,get 对应名为“get_属性名”的方法,set 对应名为“set_属性名"的方法,这在 IL 代码中写的清清楚楚。调用属性的地方实际上是调用 get 或 set 方法。

    示例类:
public class Person
{
public string Name;
private int _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}
}
    用 ildasm 看到的:
 
    get 和 set 方法在 Java 中是司空见惯的,在 C# 中用属性这种形式实现,虽然用起来像字段,但不能忘了其实质还是方法。我遇到的问题只要把用到这个字段的程序集重新编译一遍即可解决,确实不需要修改代码。
posted @ 2008-12-31 16:49 阳春三月 阅读(86) | 评论 (0)编辑

    abstract、virtual、override 和 new 是在类的继承关系中常用的四个修饰方法的关键字,在此略作总结。

1. 常用的中文名:abstract 抽象方法,virtual 虚方法,override 覆盖基类方法,new 隐藏基类方法,override 和 new 有时都叫重写基类方法。

2. 适用场合:abstract 和 virtual 用在基类(父类)中;override 和 new 用在派生类(子类)中。

3. 具体概念:

    abstract 抽象方法,是空方法,没有方法体,派生类必须以 override 实现此方法。

    virtual 虚方法,若希望或预料到基类的这个方法在将来的派生类中会被重写(override 或 new),则此方法必须被声明为 virtual。

    override 重写继承自基类的 virtural 方法,可以理解为拆掉老房子,在原址上建新房子,老房子再也找不到了(基类方法永远调用不到了)。

    new 隐藏继承自基类的 virtual 方法,老房子还留着,在旁边盖个新房,想住新房住新房(作为派生类对象调用),想住老房住老房(作为基类对象调用)。

    当派生类中出现与基类同名的方法,而此方法前面未加 override 或 new 修饰符时,编译器会报警告,但不报错,真正执行时等同于加了 new。

4. abstract 和 virtual 的区别:abstract 方法还没实现,连累着基类也不能被实例化,除了作为一种规则或符号外没啥用;virtual 则比较好,派生类想重写就重写,不想重写就吃老子的。而且继承再好也是少用为妙,继承层次越少越好,派生类新扩展的功能越少越好,virtual 深合此意。

5. override 和 new 的区别:当派生类对象作为基类类型使用时,override 的执行派生类方法,new 的执行基类方法。如果作为派生类类型调用,则都是执行 override 或 new 之后的。


演示 override 和 new 区别的例子:


// Define the base class
class Car
{
   
public virtual void DescribeCar()
   {
       System.Console.WriteLine(
"Four wheels and an engine.");
   }
}

// Define the derived classes
class ConvertibleCar : Car
{
   
public new virtual void DescribeCar()
   {
       
base.DescribeCar();
       System.Console.WriteLine(
"A roof that opens up.");
   }
}
class Minivan : Car
{
   
public override void DescribeCar()
   {
       
base.DescribeCar();
       System.Console.WriteLine(
"Carries seven people.");
   }
}
public static void TestCars1()
{
   Car car1 
= new Car();
   car1.DescribeCar();
   System.Console.WriteLine(
"----------");

   ConvertibleCar car2 
= new ConvertibleCar();
   car2.DescribeCar();
   System.Console.WriteLine(
"----------");

   Minivan car3 
= new Minivan();
   car3.DescribeCar();

   System.Console.WriteLine("----------");

}

 

输出类似如下所示:

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

但是,如果我们声明一个从 Car 基类派生的对象的数组。此数组能够存储 Car、ConvertibleCar 和 Minivan 对象,如下所示:


public static void TestCars2()
{
    Car[] cars 
= new Car[3];
    cars[
0= new Car();
    cars[
1= new ConvertibleCar();

    cars[2] = new Minivan();

}

 

然后用一个 foreach 循环来访问该数组中包含的每个 Car 对象,并调用 DescribeCar 方法,如下所示:


foreach (Car vehicle in cars)
{
  System.Console.WriteLine(
"Car object: " + vehicle.GetType());
  vehicle.DescribeCar();

  System.Console.WriteLine("----------");

}

 

此循环的输出如下所示:

Car object: YourApplication.Car

Four wheels and an engine.

----------

Car object: YourApplication.ConvertibleCar

Four wheels and an engine.

----------

Car object: YourApplication.Minivan

Four wheels and an engine.

Carries seven people.

----------

注意,ConvertibleCar 的说明可能与您的预期不同。由于使用了 new 关键字来定义此方法,所调用的不是派生类方法,而是基类方法。Minivan 对象正确地调用重写方法,并产生预期的结果。


 

posted @ 2008-12-31 15:42 阳春三月 阅读(115) | 评论 (0)编辑

2008年9月3日

 
    在 Windows 平台上,.Net 的 CLR 可以由三种程序启动及初始化:Shell 程序(explorer.exe)、IE 浏览器和IIS(其辅助进程aspnet_wp.exe)。对于需要丰富的交互操作,而用户又不想安装客户端软件的项目,以 IE 做宿主,承载用.Net 开发的 Winform 应用程序在其上运行,有时也是一个不错的选择。
 
一、工作原理
    以 IE 承载 Winform 程序运行,一般都是在网页上运行具有丰富交互功能的 Winform 用户控件。其工作流程如下:首先把 Winform 控件程序集及其依赖程序集(.dll)放在网站某个目录下,然后用户用 IE浏览网页时,如果该网页用到了 Winform 用户控件,则浏览器会自动把这些程序集下载到客户端 IE 的临时目录,之后 IE会创建一个应用程序域加载并运行这些程序集,则用户就在网页上看到了 Winform 控件,当然还可以执行这个控件的功能,比如弹出Winform 窗体等。
 

二、开发过程
1. 开发 Winform 用户控件库,比如 MyControls.dll。
2. 建立 ASP.Net 网站,在网页的 HTML 代码中加入 <object> 标签调用 Winform控件,格式如:
 <OBJECT id="myControl" height="100%" width="100%"classid="http:.\WinformCtrl\MyControls.dll#MyControls.MyChartControl"VIEWASTEXT>
  <param name="ChartName" value="aaaaa">
  <param name="ChartColor" value="Red">
 </OBJECT>
    其 classid 属性是关键,“#”号前面是到哪儿找 Winform程序集,后面是控件的完全限定名。用 param 给控件传入属性数据。
3. 编译发布网站,在 IIS 中创建虚拟目录发布之,比如 http://192.168.0.1/MyWinApp/*。
4. 在客户端用 .Net Framework 的配置工具配置计算机的运行库安全策略(创建 URL 类型的代码组),比如给来自http://192.168.0.1/MyWinApp/*的程序集以 FullTrust 权限集。可以在命令行下用代码访问安全策略工具 Casplo.exe:
    caspol -quiet -machine -addgroup All_Code -urlhttp://192.168.0.1/MyWinApp/*FullTrust -n 192.168.0.1_MyWinApp -d "用 IE 承载 Winform 控件测试网站"
5. 在客户端用 IE 浏览网站,在网页上显示 Winform 控件并可执行功能。
 
三、实践经验
 
1. 下载程序集的位置
用 IE 承载的 Winform 控件程序集及其依赖程序集,运行时会被自动下载到 IE 的临时目录,但这些程序集不能从 ASP.Net网站的 Bin 目录下下载,必须要另外建一个目录( 如 WinformCtrl )以供存放和从中下载。
 
2. 配置文件
寄宿于 IE 的应用程序如果有配置文件,则配置文件可以放在能从网站下载的地方,比如 WinformCtrl 目录中,并在网页的HTML 代码中用 <link> 标记指定,格式为:
 <link rel="CONFIGURATION"href="WinformCtrl/MyControls.dll.config" />
MSDN中说必须“将配置文件与可执行文件置于相同位置。”,但经试验,发现不仅配置文件的名称可以任意命名,连位置也不一定要跟可执行文件在同一目录,只要能根据<link> 标记找到即可。
从配置文件的使用可以看出 IE 创建应用程序域的原则:所有指向同一配置文件的页在同一应用程序域中创建。这样,就可以基于每个配置文件创建应用程序域。
 
3. 程序调试
不好调。Winform 控件库的开发阶段还可以用一个 C/S 程序模拟 IE 调试其功能,但在 IE 中调用 Winform控件库运行后,只能通过 IEHost.dll 生成一个 IE 的调试日志文件。生成 IE 调试日志的方法是通过改注册表激活IEHost:
a.找到并单击下面的注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework
b. 在该项中添加一个名为DebugIEHost 的 DWORD 值,然后为其指定一个任意非零值。
c. 添加一个名为IEHostLogFile的字符串值。为该值指定用于记录调试日志的文件的完整路径(包括文件名)(例如,C:\Temp\IEDebug.log)。 
调试时还要注意可能需要手工更新下载程序集缓存,即用 gacutil /cdl 命令清空C:\WINDOWS\assembly 的 Download 目录。
 
总的来说,用 IE 承载 Winform 应用程序的实现方案,既有在浏览器上可获得 Winform 强大用户体验的优势,也有诸多不足:首先是客户端安全配置比较麻烦;其次是有时依赖程序集不好定位;再就是客户端下载程序集缓存不好更新。针对这些不足,微软的 SilverLight 也许是个更好的解决方案。
 

参考:
使用 Internet Explorer 部署运行库应用程序
http://msdn.microsoft.com/zh-cn/library/a7as3z1d.aspx
 
HOW TO:使用 IEHost 日志调试 Internet Explorer 中承载的 .NET 对象
http://support.microsoft.com/kb/313892/zh-cn
 
在 IE 中使用 Windows 窗体控件
http://www.cnblogs.com/beginor/archive/2007/06/02/768876.html
 
.Net托管世界的应用程序域和线程
http://blog.csdn.net/shanhe/archive/2004/11/03/164580.aspx
posted @ 2008-09-03 22:09 阳春三月 阅读(409) | 评论 (0)编辑

2008年8月28日

如果 VS2008 和 TFS2008 安装在同一台机器上,则安装完 VS2008 SP1 之后,TFS 服务将无法启动。从 Team Explorer 连接 TFS 服务器时提示:
 
----------------------------------------------------------
TF31001: Team Foundation 无法从 Team Foundation Server OGTSOFTMDY 检索团队项目列表。Team Foundation Server 返回了下面的错误: 该服务器不提供 Team Foundation 服务。
 
技术信息(适用于管理员):
 
  TF30059: Fatal error while initializing web service。
----------------------------------------------------------
 
检查 Windows 事件查看器,发现来自 TFS Service 的错误,描述如下:
 
----------------------------------------------------------
TF53010: Team Foundation 组件或扩展中发生了以下错误:
日期(UTC): 2008-8-27 9:08:28
计算机: OGTSOFTMDY
应用程序域: /LM/W3SVC/1926526102/Root/Services-1-128643016359218750
程序集: Microsoft.TeamFoundation.Server, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a; v2.0.50727
进程详细信息:
  进程名: w3wp
  进程 Id: 268
  线程 Id: 3048
  帐户名: OGTSOFTMDY\TFSService
 
详细消息: TF53013: 正在为 Microsoft 准备故障报告。该报告中包括下列信息:
……
……
Exception: TypeInitializationException
Message: “Microsoft.TeamFoundation.Server.IntegrationResourceComponent”的类型初始值设定项引发异常。
Stack Trace:
   在 Microsoft.TeamFoundation.Server.IntegrationResourceComponent.RegisterExceptions()
   在 Microsoft.TeamFoundation.Server.Global.Initialize()
   在 Microsoft.TeamFoundation.Server.TeamFoundationApplication.Init()
Inner Exception Details
Exception: ReflectionTypeLoadException
Message: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。
Stack Trace:
   在 System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)
   在 System.Reflection.Assembly.GetTypes()
   在 Microsoft.TeamFoundation.Server.SqlResourceComponent.RegisterExceptions(Assembly assembly)
   在 Microsoft.TeamFoundation.Server.IntegrationResourceComponent.RegisterExceptions()
   在 Microsoft.TeamFoundation.Server.IntegrationResourceComponent..cctor()
……
……
----------------------------------------------------------
 
解决办法:安装 TFS SP1。
 
参考:After upgrading VS 2008 to SP1, also upgrade TFS 2008 to SP1

posted @ 2008-08-28 15:27 阳春三月 阅读(385) | 评论 (3)编辑

导航

公告

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔分类(119)

相册

收藏夹(40)

.Net

Oracle

友人

积分与排名

最新评论

阅读排行榜

评论排行榜