当前位置:编程学习 > C#/ASP.NET >>

问一个关于程序集的问题:)【别笑我白痴】

  因为是自学的c# 2.0开始学起编程的 几乎没多少基础 
  照本 选科的学习是蛮枯燥的 而且好像因为对程序的低层运行没什么了解  所以想问熟悉程序的人帮忙解释下几个问题 
  也不是我懒 实在是书上的语言不够形象 太专业化 好多专业的名词都不懂,更何况还有专业化名词基础上的专业化名词,别介绍我去找书恶补基础了,试着解答一下 一人一个说法 说不定我就懂了 
  不是什么实际问题 是看书的时候疑惑了 才问的 
  1.程序集版本冲突发生的时候到底是什么一种情况啊? 
  希望回答的朋友给举一个例子 比如一个程序在运行的怎么遇到版本冲突了?举个程序运行的例子啊  从程序的运行开始到发生版本冲突以及这个问题的发展,还有是.net怎么解决这个问题的。 
  2.硬盘上有一些程序文件,鼠标一点程序就运行了,然后就使用。但这个过程只是看到的,幕后详细的情况是怎么样的呢,也看过书可还是感觉很虚渺啊,就拿.net 框架下的程序运行当例子吧,详细一点,俗一点的例子,别太教课书了 
  不怕麻烦的热心朋友帮忙详细解释一下程序运行的过程吧 
   --------------------编程问答-------------------- 程序文件在点击运行的时候有个入口,就是Programer.cs文件中的Main()函数,然后它(Main函数)里面会实例化一个类(或者叫窗体),类(窗体)在实例化的时候会调用构造函数对自身进行构造,这个构造函数可以自己写,系统默认有一个,这就要看你在实例化的时候调用的是哪个了,构造完之后,就要等待用户触发一些事件,当某事件触发后,它就会执行这个事件中的代码,比如Button_Click()等等。随便说说,中间会又一些没有提到,但是大概的意思就这样吧!请楼下的指正。 --------------------编程问答-------------------- MSDN上的内容:

运行库如何定位程序集  

若要成功地部署 .NET Framework 应用程序,必须了解公共语言运行库如何定位和绑定组成应用程序的程序集。默认情况下,运行库试图与生成应用程序使用的程序集的原版本绑定。这种默认行为可以由配置文件设置覆盖。

在试图定位程序集并解析程序集引用时,公共语言运行库将执行若干个步骤。以下几节中对每个步骤进行了解释。当描述运行库如何定位程序集时,通常使用“探测”一词;它是指基于名称和区域性定位程序集时使用的一组试探法。

注意 
您可以使用包含在 .NET Framework SDK 中的程序集绑定日志查看器 (Fuslogvw.exe) 来查看日志文件中的绑定信息。
 

开始绑定
当运行库试图解析对另一个程序集的引用时,就开始进行定位并绑定到程序集的进程。该引用可以是静态的,也可以是动态的。在生成时,编译器在程序集清单的元数据中记录静态引用。动态引用是由于调用各种方法而动态构造的,例如 System.Reflection.Assembly.Load 方法。

引用程序集的首选方式就是使用完全引用,包括程序集名称、版本、区域性和公钥标记(如果存在)。运行库就会按照本节后面描述的步骤,使用这些信息来定位程序集。无论引用是对静态程序集的引用还是对动态程序集的引用,运行库均使用相同的解析过程。

还可通过向调用方法仅提供有关程序集的部分信息的方式(例如仅指定程序集名称),对程序集进行动态引用。在这种情况下,仅在应用程序目录下搜索程序集,不进行其他检查。使用加载程序集(如 System.Reflection.Assembly.Load 或 System.AppDomain.Load)的各种方法中的一种进行部分引用。 

最后,您可以使用诸如 System.Reflection.Assembly.Load 之类的方法进行动态引用并只提供部分信息;然后在应用程序配置文件中用 <qualifyAssembly> 元素限定该引用。该元素使您可以在应用程序配置文件中而不是在代码中提供完全引用信息(名称、版本、区域性,如果适用还有公钥标记)。如果要在应用程序目录外完全限定对某个程序集的引用,或者如果要引用全局程序集缓存中的程序集,但又希望方便地在配置文件中而不是在代码中指定完全引用,就可以采用这一技术。

注意 
对于在多个应用程序间共享的程序集,不应使用这种部分引用。因为配置设置是应用于每一应用程序而不是每一个程序集的,所以使用这种部分引用的共享程序集会有这样的要求:使用该共享程序集的每一应用程序都要在其配置文件中具有限定信息。
 

运行库使用以下步骤来解析程序集引用: 

通过检查适用的配置文件(包括应用程序配置文件、发行者策略文件和计算机配置文件),确定正确的程序集版本。如果配置文件位于远程计算机上,则运行库必须首先定位和下载应用程序配置文件。

检查程序集名是否以前已被绑定,如果已绑定,则使用以前加载的程序集。

检查全局程序集缓存。如果在其中找到了程序集,则运行库使用该程序集。

按以下步骤探测程序集: 

如果配置策略和发行者策略不影响原始引用,并且绑定请求是使用 Assembly.LoadFrom 方法创建的,则运行库检查位置提示。

如果在配置文件中找到了基本代码,则运行库只检查该位置。如果该探测失败,则运行库确定绑定请求已失败,并且不再进行其他的探测。

使用探测部分中描述的试探法探测程序集。如果探测后没有找到程序集,则运行库请求 Windows Installer 提供程序集。它用作一个即需即装功能。 

注意 
不对没有强名称的程序集进行版本检查,并且运行库也不在全局程序集缓存中检查没有强名称的程序集。
 
--------------------编程问答-------------------- 我也没研究过这些,学习了。 --------------------编程问答-------------------- 1.多个项目引用同一个程序集,使用的程序集版本不同
绑定重定向,Visual Studio 在 app.config 中保存重定向信息。如果使用绑定重定向,则不会再出现此警告
--------------------编程问答-------------------- 不了解 
学习 --------------------编程问答-------------------- 我也是新手,学习了 --------------------编程问答-------------------- 1.那是在ASSEMBLY当中定义的版本所造成的,这个你具体得看一下反射那块的东西了,如果发现版本不对会抛出一个异常。
2.。NET的程序如楼上所说,不过其实他真正的入口还是WINMAIN然后注册窗口,建立消息循环。 --------------------编程问答-------------------- 多看看基础的书就对了 --------------------编程问答-------------------- 看一下,,路过 --------------------编程问答--------------------
引用 1 楼 hao1hao2hao3 的回复:
程序文件在点击运行的时候有个入口,就是Programer.cs文件中的Main()函数,然后它(Main函数)里面会实例化一个类(或者叫窗体),类(窗体)在实例化的时候会调用构造函数对自身进行构造,这个构造函数可以自己写,系统默认有一个,这就要看你在实例化的时候调用的是哪个了,构造完之后,就要等待用户触发一些事件,当某事件触发后,它就会执行这个事件中的代码,比如Button_Click()等等。随便说说,中间会又一些没有提到,…


这样说跟没说一样。 --------------------编程问答-------------------- 1.程序集版本冲突发生的时候到底是什么一种情况啊? 
=======
.net仅对具有强名称的程序集进行版本控制。
没有强名称的程序集不会有版本冲突的问题.
举个例子,如果一个程序中有一个程序集(dll).那么如果你是个天才,你写一个和他一样的dll文件放上去(替换他),他也是可以用的

2.硬盘上有一些程序文件,鼠标一点程序就运行了,然后就使用。但这个过程只是看到的,幕后详细的情况是怎么样的呢,也看过书可还是感觉很虚渺啊,就拿.net 框架下的程序运行当例子吧,详细一点,俗一点的例子,别太教课书了 
==========================
这个问题要说的内容太大了.你要从clr,.net运行原理等等看起

详细内容请参考这里:http://msdn.microsoft.com/zh-cn/library/hk5f40ct(VS.80).aspx --------------------编程问答-------------------- 学习了  这太复杂了  什么计算机原理都得用上了 --------------------编程问答--------------------
引用 10 楼 abcyzq 的回复:
引用 1 楼 hao1hao2hao3 的回复:
程序文件在点击运行的时候有个入口,就是Programer.cs文件中的Main()函数,然后它(Main函数)里面会实例化一个类(或者叫窗体),类(窗体)在实例化的时候会调用构造函数对自身进行构造,这个构造函数可以自己写,系统默认有一个,这就要看你在实例化的时候调用的是哪个了,构造完之后,就要等待用户触发一些事件,当某事件触发后,它就会执行这个事件中的代码,比如Button_Click()等等。…




你可以对我的观点进行评论,有错误也希望你指正,但是你这样说,就让我很鄙视你了,最少我说了自己的观点,起不起作用,那是另外一回事,不像某些人,什么都没有留下,还在这里乱叫。有种,你不查资料把你自己的理解写出来。 --------------------编程问答-------------------- 我对程序集也不太清楚,在此和楼主一起学习了 --------------------编程问答-------------------- up 谢谢前面各位的解答 我有点认识了 --------------------编程问答-------------------- 学习了,需要研究研究。 --------------------编程问答-------------------- 你第二个问题,1楼的基本上从表面上解答清楚了。要是想了解更底层,你就自己随便建个程序,设置断点调试运行

看下他的内部运行机制

还有就是BAIDU 下CLR --------------------编程问答-------------------- 你第二个问题,1楼的基本上从表面上解答清楚了。要是想了解更底层,你就自己随便建个程序,设置断点调试运行

看下他的内部运行机制

还有就是BAIDU 下CLR --------------------编程问答-------------------- ding
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,