Why not work at run-time?

本文探讨了一段代码在设计时能正常工作,但在运行时却无法显示StringDictionaryEditor的问题。问题根源在于.NET框架通过字符串获取Type时需要完整的类型名称,包括类型名、程序集名、版本等。文章提供了通过处理AssemblyResolve事件来解决此问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么这段code在 design-time工作正常但是run-time缺不能显示StringDictionaryEditor呢?
tongue_smile.gif

using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System.ComponentModel;

using System.Drawing;

using System.Windows.Forms;

using System.Collections.Specialized;

 

namespace MySimpleControl

{

     public class MyCtl : UserControl

     {

         private StringDictionary environmentVariables = new StringDictionary();

 

         [

         DesignerSerializationVisibility(DesignerSerializationVisibility.Content),

         Editor("System.Diagnostics.Design.StringDictionaryEditor, System.Design",

              "System.Drawing.Design.UITypeEditor,System.Drawing")

         ]

         public StringDictionary EnvironmentVariables

         {

              get {return this.environmentVariables;}

              set 

              {

                   this.environmentVariables = value;

 

 

              }

         }

     }

}

 

UPDATE: 问题出在”System.Diagnostics.Design.StringDictionaryEditor, System.Design”这个声明上,
.NET在通过字符串取得一个Type时要求输入Full Qualified Type Name(FQTN)
FQTN:包括 <typename>, <assembly name>, <version>, <culture>, <PublickeyToken>[,<Custome...>]
例如 WinForm中Form类的Type就是
System.Windows.Forms.Form, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null
我们可以使用Type.GetType方法来取得对应的类型。
那为什么文档中告诉我们可以只写System.Design就可以了呢?答案时VS.NET IDE会帮我们补全。
在GetType过程中,CLR会尝试装载指定的assembly,当CLR无法装载某个assembly时(例如assembly找不到,或assembly 的Full Qualified Assembly Name 不完整)则会触发当前AppDomain的AssemblyResolve事件,VS.NET IDE正是使用了这个事件帮助我们解析并装载合适的Assembly,这样这个字符串就可以正常运行了。
当然现在我们就有了解决方法,自己处理AssemblyResolve事件。

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)

{

     if (args.Name == "System.Design")

     {

         Assembly asm = Assembly.Load("System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

         return asm;

     }

     if (args.Name == "System.Drawing")

     {

         Assembly asm = Assembly.Load("System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

         return asm;

     }

     return null;

}


 

转载于:https://www.cnblogs.com/jonnyyu/archive/2004/02/19/1401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值