none
[求解答].net 中资源文件所生成的DLL是如何被加载到程序中并运作起来的。 RRS feed

  • 问题

  • 这是两个过程中我发现的疑问,先说第一个:
    创建一个C#控制台程序,随便叫什么名字吧,main方法里面就放一句话:
    static void Main(string[] args)
        {
            Console.WriteLine("hello world");
            Console.Read();
        }
    

    大家都能看懂,是干啥。
    这时候:
    1、右键项目,选择属性,出来的属性窗口在左边选中资源,会提示:该项目没有资源文件,单击此处创建一个。
    2、单击一下,创建一个资源文件,默认叫做Resource.resx,还会跟着一个Resource.Designer.cs文件。
    3、在解决方案资源管理器窗口右键Resource.resx文件,选择重命名,改成:Resource.zh-Hans.resx。那个Designer.cs文件会跟着一起变。
    4、再次重复1所做的事情,它仍然会提示,没有资源文件,单击创建一个。
    5、好了,现在项目中有一个Resource.resx和一个Resource.zh-Hans.resx资源文件。
    6、双击Resource.resx,新建一个字符串,名称就用:strFirstWord,值就写:Hello world。
    7、双击Resource.zh-Hans.resx,同样出现了资源编辑界面,新建一个字符串,名称跟上面一样,strFirstWord,值写成:世界你好。
    8、把刚才的Main方法改写一下。
     
    static void Main(string[] args)
        {
            Console.WriteLine(Properties.Resource.strFirstWord);
            Console.Read();
        }
    完成,这时候运行一下你的程序,看看什么情况。
    如果你的操作系统是中文简体的,就会显示:世界你好。如果不是,则会显示Hello world。
    现在是问题了:我没有在我的代码任何地方设置关于区域的信息,也没有刻意指定这些信息。那么编译器到底是怎么做的。
    第二个问题:
    我们检查一下输出文件夹:bin\Debug\下面,会看到一个控制台程序的exe文件,正如我们常见那样。同时还会出现一个文件夹:zh-Hans\,里面有这样一个文件:yourProjectName.resources.dll,很显然,刚才的“世界你好”这个字符串被存在这里了。
    当我尝试移除这个文件或者文件夹的时候,程序运行会报错,无法加载程序集xxxx。
    那么,到底程序是在什么时候加载了这个文件,如何加载的。这个文件是程序集的格式,可是我用添加引用方式无法看到里面有什么信息,反编译也没啥有效地信息。
    请问,如何查看到这个文件的信息。我是否可以采用外部编辑的方式,修改这个文件,然后让程序在运行时调用输出的是其他信息。
    这是在命令行程序的情况下的问题。
    另外还有winform程序的问题,等这个有了结果再继续问。
     
     


    • 已编辑 Arnu Xie 2011年12月30日 3:06
    2011年12月30日 3:03

答案

  • C#程序到执行经过了这样几个阶段: C# 先有CSC.exe(C#编译器)编译为中间语言(IL)然后有JIT(即时编译器 Just in time)编译为CLR(公共语言运行时 Common Language Runtime) 所识别 的代码,然后有CLR到计算机平台执行。(语言组织不好,请见谅。更多交流可以:rocky_msn@hotmail.com

    一个程序在编译之后,会包含一个叫manifest的程序集清单,里面包含了所需要的程序集和其他东西。在运行的时候,程序会根据需要去找到程序集并调用里面的方法。这些事情在编译的时候有IDE如Visual Studio帮我们做,在运行的时候,由CLR帮我们做了。

    如果要了解到深入一点的话,建议你先看一下CLR via C# 这本书,了解一下.Net 是怎么运行的。

    从你的程序来看,这点最多使用的地方就是全球化,也叫本地化,简单来说就是根据地区文化的不同,显示的内容不同,像网页上的中文简体和中文繁体一样。

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2012年1月2日 7:49
    版主

全部回复

  • 这个我觉得应该跟多语言有关吧,多语言是作为程序的一部分进行运行的,不过加载程序集不怎么能理解,LZ能不能发个外链,把你的工程发出来看看?
    2011年12月31日 14:10
  • C#程序到执行经过了这样几个阶段: C# 先有CSC.exe(C#编译器)编译为中间语言(IL)然后有JIT(即时编译器 Just in time)编译为CLR(公共语言运行时 Common Language Runtime) 所识别 的代码,然后有CLR到计算机平台执行。(语言组织不好,请见谅。更多交流可以:rocky_msn@hotmail.com

    一个程序在编译之后,会包含一个叫manifest的程序集清单,里面包含了所需要的程序集和其他东西。在运行的时候,程序会根据需要去找到程序集并调用里面的方法。这些事情在编译的时候有IDE如Visual Studio帮我们做,在运行的时候,由CLR帮我们做了。

    如果要了解到深入一点的话,建议你先看一下CLR via C# 这本书,了解一下.Net 是怎么运行的。

    从你的程序来看,这点最多使用的地方就是全球化,也叫本地化,简单来说就是根据地区文化的不同,显示的内容不同,像网页上的中文简体和中文繁体一样。

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2012年1月2日 7:49
    版主