这两天在项目进行中遇到一个诡异的问题,先介绍一下代码环境和问题现象。

我们的代码目录为SRC\Module\SubModule\PojectDir,输出和引用位置是和SRC同目录的目录Reference。之前一直相安无事。不管是在VS中还是使用MSBUILD命令都能正常完成。

前两天因为其它原因,需要进行多语言化生成资源文件,就在CSPROJ文件中加入了UICulture节点。但不管加几个节点,都只能生成一个Resources.dll。怎么办呢,我们就想到使用MSBUild多次调用指定UICulture变更来生。其它的动态连接程序集生成方式是先生成在ProjectDir目录下对应的Bin下的目录,然后再使用COPy到Reference目录。这都很正常。

但执行程序集我们是直接生成输出到Reference目录的,这就导致只有最后生成语言集的Resurces.dll。我们想按照动态连接程序集的方式将之生成到ProjectDir下,再拷贝到Reference。这个时候问题来了,现象就是:不改变编译输出目录(直接生成在Reference),一切正常,可以编译成功;但只要一改变输出目录,就会提示某些资源(WPF资源)找不到。找两天没找到原因。

今天一同事无意中打开CSPROJ源文件查看,发现引用的程序集目录都不一样。有的上前三级目录,有的是前四级目录(正常是四级)下的Reference。把所有的引用都改为正确的。然后改变输出目录,OK,编译通过了。

根据结果猜测原因:应该是MSBuild查找引用的时候优先在输出同级目录查找并引用,如果找不到再按照指定的路径查找引用程序集。这样就可以解释清楚开始的时候为什么一改变输出路径就编译不通过的原因了。

作一下记录,以备不时之需,也给大家一个经验。以后遇到问题可以多方查找,多方查看,不要把自己的思路局限。