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

Frame-independent movement If you run everything we have done so far, you will be able to move the circle, but it won't move uniformly. It will probably be very fast, because currently we have done the movement in a very naive way. Right now your computer will be running the update() function as fast as it can, which means it will probably call it a couple of hundreds of times each second, if not more. If we move the shape by one pixel for every frame, this can count up to several 100 pixels every second, making our little player fly all over the screen. You cannot just change the movement value to something lower, as it will only fix the problem for your computer. If you move to a slower or faster computer, the speed will change again. So how do we solve this? Well, let's look at the problem we are facing. We are having a problem because our movement is frame-dependent. We want to provide the speed in a way that changes depending on the time a frame takes. There is a simple formula you should remember from your old school days. It's the formula that goes: distance = speed * time. Now why is this relevant for us? Because with this formula we can calculate a relevant speed for every frame, so that the circle always travels exactly the distance we want it to travel over one second, no matter what computer we are sitting on. So let's modify the function to what we actually need to make this work. void Game::update(sf::Time deltaTime) { sf::Vector2f movement(0.f, 0.f); if (mIsMovingUp) movement.y -= PlayerSpeed; if (mIsMovingDown) movement.y += PlayerSpeed; if (mIsMovingLeft) movement.x -= PlayerSpeed; if (mIsMovingRight) movement.x += PlayerSpeed; mPlayer.move(movement * deltaTime.asSeconds()); } The major difference we have made here is that we now receive a time value every time we call the update. We calculate the distance we want to travel every frame, depending on how much time has elapsed. We call the time that has elapsed since the last frame delta time (or time step), and often abbreviate it as dt in the code. But how do we get this time? We are lucky because SFML provides the utilities for it.翻译
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值