编译期间的程序集解析顺序

时间:2009-08-25 02:21:01

标签: visual-studio-2008

VS 2008如何确定在编译应用程序期间查找组件的位置?必须使用一些订单。是否在Tools \ Settings或其他内容中使用了某些内容?我正在寻找在编译过程中发生程序集解析的顺序。

3 个答案:

答案 0 :(得分:2)

确实不是VS 2008确定顺序,而是编译器。我知道你没有指定一种语言,但我会用C#作为例子(我相信很多其他语言也可以作为一个很好的例子)。如果您使用的是C#,则编译器首先处理csc.rsp(位于csc.exe旁边的响应文件),然后处理命令行/ r:选项。操作顺序决定引用哪个程序集。因此,首先找到csc.rsp中的程序集引用,然后找到命令行程序集。这是编译时。

以下是C#响应文件的文档:

http://msdn.microsoft.com/en-us/library/8a1fs1tb(VS.71).aspx

以下是C#命令行编译器选项的文档:

http://msdn.microsoft.com/en-us/library/2fdbz5xd(VS.71).aspx

如果要使用自定义响应文件,则必须使用命令行编译器。否则,您添加到项目的references文件夹的引用将确定在VS中构建时命令行上显示的内容。您可以通过执行构建并查看输出窗口Ctrl + W + O来查看这些引用在命令行中显示的顺序。

运行时程序集绑定既不由VS确定,而是由CLR确定。快速摘要是CLR搜索以查看程序集先前是否已加载到内存中,检查GAC,然后根据代码中是否存在对Load的显式调用,然后是codeBase的配置文件设置来执行探测,然后在应用程序文件夹下的一组文件夹,这些文件夹以程序集的exe或dll版本命名。这是MSDN链接:

http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

你提出这个问题的事实让我想知道你的动机是否要解决装配绑定问题。 .NET Framework SDK中有一个工具,称为程序集绑定日志查看器(Fuslogvw.exe),用于帮助解决这些类型的问题:

http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspx

网络上用于处理装配绑定和Fusion日志查看器的几个最佳资源是Richard Grimes的Fusion Workshop:

http://www.grimes.demon.co.uk/workshops/fusionWS.htm

几年前,作为CLR团队成员的Suzanne Cook在CLR绑定方面做了一系列精彩的帖子:

http://blogs.msdn.com/suzcook/default.aspx

希望这有帮助,

答案 1 :(得分:1)

这篇文章看起来可能会对你的问题有所了解......抱歉,我没有时间得到更好的答案。

http://blogs.msdn.com/saraford/archive/2008/10/13/did-you-know-how-to-change-the-build-order-for-your-solution-333.aspx

答案 2 :(得分:0)

非常确定这取决于您添加引用的方式。

认为它是这样的:

  1. 如果是GAC参考,请查看GAC
  2. 如果是项目引用,则来自项目的构建输出
  3. 如果是文件引用,则查看文件位置
  4. 如果您直接引用某种类型,那么除非您引用其包含的程序集,否则您的项目将不会构建,因此它不像您可以将文件放在公共目录中并进行编译。您必须明确引用程序集。

    在运行时,程序集解析更受关注。在编译时,它非常确定。