.NET中如何使用嵌入的资源

.Net中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。下面分别详述这两种方法:

使用GetManifestResourceStream读取嵌入资源

  1. 加入资源文件

    直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的根目录,可以加在项目的任何目录中。

  2. 设置资源文件的“BuildAction”属性

    将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource”

  3. 代码中使用嵌入资源

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

//根据名称空间和文件名生成资源名称

string resourceName = _namespace + ".directory.BitmapManifest.bmp";

//根据资源名称从Assembly中获取此资源的Stream

Stream stream = _assembly.GetManifestResourceStream(resourceName);

Image myImage = Image.FromStream(stream);

上述代码中有部分步骤是为了获得resourceName的值,resourceName的值结构形式类似于:”命名空间.目录路径.文件名+后缀”

此外还有一种访问资源的格式:”assembly://SpringSample/Sample.Spring/Resources.BitmapManifest.bmp”,有点像URI格式,不同的是协议为”assembly://”,”SpringSample”为程序集名称,”Sample.Spring”为默认命名空间,”Resources”为目录路径。注意:程序集名称与默认命名空间之间、默认命名空间与目录路径之间用”/”分隔,目录路径与文件名之间用”.”分隔,因为如此我们理解了访问资源的路径方式,就可以直接进行引用了。

使用. resx资源文件嵌入资源

  • 新建资源文件

    在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。
    其实资源文件最大的用处是用来做多语言版本的软件时保存不同语言的资源,比如不同语言的菜单文本,可以把不同语言的字符串放在同一个资源类型下的不同资源包中,程序运行时根据运行时系统的culture选择不同的包显示不同语言的字符串。
    新建了资源文件后就能往资源文件中添加资源文件:

    资源中可以添加字符串、位图、图标、音频、文件等等的资源。
    添加的资源都会被保存在项目的Resources文件夹中。

  • 设置资源文件的“BuildAction”属性

    Resources文件夹中的所有资源文件的“BuildAction”属性设置为“Embedded Resource”。

  • 资源存在方式

    .resx资源文件管理的资源可以用两种存在形式,一种是以一般的文件形式存在于Resources文件夹中,另一个是经过Base64编码后嵌入到.resx资源文件中。
    打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是一样的。

  • 代码中使用嵌入资源
    Icon myIcon = (Icon)Resource1.ResourceManager.GetObject("IconTest");
    Icon myIcon = Resource1.MyIcon
  • 多语言的资源应用

    //得到当前语言环境
    CultureInfo ci = Thread.CurrentThread.CurrentCulture;
    //CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
    
    Icon myIcon = (Icon)Resource1.ResourceManager("IconText", ci);

浅谈C#中子类用new与override的区别

我们先看代码和运行结果,代码:

BaseClass.cs文件:

    public class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("Base Constructed Function");

        }

        public virtual void Execute()
        {
            Console.WriteLine("Base Virtual Execute Function");
        }

        public virtual void Execute2()
        {
            Console.WriteLine("Base Virtual Execute2 Function");
        }

    }

ChildClass.cs文件:

    public class ChildClass : BaseClass
    {
        public ChildClass()
        {
            Console.WriteLine("Children Constructed Function");
        }

        public override void Execute()
        {
            Console.WriteLine("Children Execute Function");
        }

        public new void Execute2()
        {
            Console.WriteLine("Children Execute2 Function");
        }

    }

Program.cs文件:

    class Program
    {
        static void Main(string[] args)
        {
            #region 直接创建子类对象
            ChildClass A = new ChildClass();
            A.Execute();
            A.Execute2();
            #endregion

            #region 使用父类型引用子类型
            BaseClass B = new ChildClass();
            B.Execute();
            B.Execute2();
            #endregion

            Console.ReadKey();
        }
    }

运行结果:

我们有发现:

C# override,重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写,实现新的功能,它必须与父类方法的签名完全一致,而且与父类方法的可访问性也必须一致,此关键字不可以用于重写非虚方法和静态方法,。

new,隐藏,是指在子类中重新定义一个签名与父类方法相同的方法,父类的同名方法只是被隐藏而未被覆盖,这个方法也可以不显示使用new修饰,只是编译时会弹出一个警告信息:如果是有意隐藏,请使用关键字new。

多线程应用中使用静态方法是否有线程安全问题

类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。

简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。

我们知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。

那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。

因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。

静态变量前加volitile,静态函数里面使用Lock控制线程安全。

对于ASP.NET Web应用程序, 多个客户端访问服务端, 就是一个多线程的例子。

C#运算符关键字 – AS运算符

从这一篇开始,我将为大家带来一些C#运算符关键字,我们时常会用到它们,但是可能只知其然不知其所以然,所以整理出来,供大家参考:

as 运算符用于在兼容的引用类型之间执行某些类型的转换。 例如:

 class csrefKeywordsOperators
   {
       class Base
       {
           public override string  ToString()
           {
	             return "Base";
           }
       }
       class Derived : Base 
       { }

       class Program
       {
           static void Main()
           {

               Derived d = new Derived();

               Base b = d as Base;
               if (b != null)
               {
                   Console.WriteLine(b.ToString());
               }

           }
       }
   }

备注


as 运算符类似于强制转换操作。 但是,如果无法进行转换,则 as 返回 null 而非引发异常。 请看下面的表达式:

expression as type

它等效于以下表达式,但只计算一次 expression。

expression is type ? (type)expression : (type)null

注意,as 运算符只执行引用转换和装箱转换。 as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用强制转换表达式来执行。

 

class ClassA { }
class ClassB { }

class MainClass
{
    static void Main()
    {
        object[] objArray = new object[6];
        objArray[0] = new ClassA();
        objArray[1] = new ClassB();
        objArray[2] = "hello";
        objArray[3] = 123;
        objArray[4] = 123.4;
        objArray[5] = null;

        for (int i = 0; i < objArray.Length; ++i)
        {
            string s = objArray[i] as string;
            Console.Write("{0}:", i);
            if (s != null)
            {
                Console.WriteLine("'" + s + "'");
            }
            else
            {
                Console.WriteLine("not a string");
            }
        }
    }
}
/*
Output:
0:not a string
1:not a string
2:'hello'
3:not a string
4:not a string
5:not a string
*/


回顾1些在项目管理中遇到的问题和解决方式

从事软件开发很长很长1段时间了,除去在校时光,正式进行社会工作也已经4年光景了。记得最初的时候,我还是使用ASP,那会儿asp还很流行,.net framework1.1才出来不久,那会儿是2003年吧;那会儿你要既会vbscript也要会javascript;那会儿你要既会css也要会html4;那会儿你要既懂vb.net 2003,也要懂c++;总之那会儿,我接触到了很多语言、思想之类的东西。
工作4年了,大小遇到过的项目也有三四十个了吧,由于1直以来,从踏入社会的那1刻就从事项目管理和开发的工作,所以在实践的道路上遇到过很多问题,通常是通过自己翻阅资料,以及寻求互联网帮助来解决,现在也慢慢的喜欢上这种方法。
现在把1些近期项目中遇到的问题记录如下,另外也附带了自己当时的处理方法和思路:
1.信息的不对称和不及时,这个问题是所有问题的根源。打个比方,进入某个迭代的产品测试环节,产品告诉美术根据客户需求,需要将新闻和公告互换位置,美术将更改后的效果图发送至项目经理和产品进行确认,项目经理可能还不知道这样1件事,项目经理、产品、客户确认过后,美术将效果图发送至前端,前端可能还不知所以然,问:“这是什么呀?”,然后美术又需要将修改的地方告诉前端。
这种信息的不对称和不及时,在项目的开发过程中,会浪费很多时间和工作量,我们应该使用1种网络软件管理或电邮等方式,要让所有项目组的人及时清楚,以及明确各自的责任。这个环节我目前使用的是zentao来进行管理。
Continue reading “回顾1些在项目管理中遇到的问题和解决方式”