如何使用 MSBuild 引用不同版本的 dll
Posted
技术标签:
【中文标题】如何使用 MSBuild 引用不同版本的 dll【英文标题】:How to reference different version of dll with MSBuild 【发布时间】:2011-01-01 02:54:35 【问题描述】:我有一个使用一组 3rd 方 dll 的 Web 应用程序项目。问题是开发/登台环境是 32 位的,但生产环境是 64 位的。因此,我们每次要部署时都必须重新引用和构建解决方案。我现在想自动执行此操作,但不确定如何使用 MSBuild 进行操作?
所有其他 dll 都是相同的,只是 3 个 3rd 方 dll。
编辑
我已经取得了一些进展,但是遇到了一些运行时汇编问题。
我有 3 个 dll 文件,1.dll、2.dll、3.dll。每个文件版本为 5.1。对于 64 位 dll,名称完全相同,只是文件版本不同。我所做的,将每个重命名为 1.v5.dll、1.v6.dll 等。在我的项目文件中,我将每个 dll 引用如下:
<Reference Include="1.v5.dll" Condition="'$(Platform)'=='x86'">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\1.v5.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="1.v6.dll" Condition="'$(Platform)'=='x64'">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\1.v6.dll</HintPath>
<Private>False</Private>
</Reference>
这适用于 Visual Studio IDE,我的解决方案编译文件,但是当我去运行网站时,我收到以下错误...
“无法加载文件或程序集 '1.v5' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。
关于如何解决这个问题的任何想法?
【问题讨论】:
意识到它并不能回答你的问题,但是......你到底为什么要做这样的事情?尤其是在您的暂存环境中? 我们的本地和暂存环境都是32位机器,解决方案需要用32位dll编译。在我们的代码中,每个 dll(API) 都有不同的功能。然而,我们的生产环境是 64 位的,因此需要使用 64 位 dll 编译解决方案,并将这些文件复制到生产箱。每次我们想这样做时,我们都必须删除并重新引用 32/64 位 dll,这并不难,只是很痛苦。自动化这将是伟大的! 出现dll加载问题是因为你重命名了dll,例如msdn.microsoft.com/en-us/library/yx7xezcf.aspx 【参考方案1】:您可以像这样在项目文件中创建条件引用:
<Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/>
<Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/>
要在 VS 中使用它,您必须创建两个解决方案平台:一个用于 x86 目标,一个用于 x64 目标。根据活动平台,将选择其中一个 dll,无需重新引用。
要使用 msbuild 自动执行此操作,请创建一个新项目文件,该文件会多次构建另一个项目文件,每次针对不同的平台/配置/...:
<Target Name="BuildAll">
<MSBuild Targets="myproject.proj" Properties="Platform=x86;Configuration=Debug"/>
<MSBuild Targets="myproject.proj" Properties="Platform=x64;Configuration=Debug"/>
<MSBuild Targets="myproject.proj" Properties="Platform=x64;Configuration=Release"/>
</Target>
查看 MSBuild 任务参考,了解并行构建等其他选项。
【讨论】:
我创建了两个解决方案平台,x86 和 x64。我还将两个版本的 dll 添加到 bin 文件夹中。当我编辑项目文件并重新加载时,找不到引用。不知道为什么?我无法将 .dll 添加到 Include 值。我可以添加提示路径,但仍然没有得到参考。 我已经开始取得一些进展,但仍有问题。我已经添加到我的主要问题中。【参考方案2】:这是我想出来的,似乎没有问题。
我创建了 2 个解决方案平台,x86 和 x64。我在我的解决方案目录中创建了一个名为“References”的新文件夹,并创建了 n x86 和 x64 文件夹: \参考\x86\ \参考\x64\ 然后将每个的 3 个 dll 放置在它们各自的目录中。
在每个项目的文件中,我添加了以下引用:
<Reference Include="Reference1" Condition="'$(Platform)'=='x86'">
<HintPath>..\References\dlls\x86\Reference1.dll</HintPath>
</Reference>
<Reference Include="Reference2" Condition="'$(Platform)'=='x64'">
<HintPath>..\References\dlls\x64\Reference2.dll</HintPath>
</Reference>
现在,当我在 IDE 中进行开发时,我正在使用特定于我需要的相关 dll。
然后我刚刚添加了一个构建后事件,它将基于 $(Platform) 变量的 dll 复制到 bin 目录中。
【讨论】:
因为您的 HintPath 无论如何都包含平台名称,请将其替换为.\References\dlls\$(Platform)\...
以获得最大的可维护性
非常好,谢谢。但我不得不说,Visual Studio 应该让我们更容易做到这一点。什么鬼……以上是关于如何使用 MSBuild 引用不同版本的 dll的主要内容,如果未能解决你的问题,请参考以下文章
Docs-VisualStudio-MSBuild-MSBuild参考:常用的 MSBuild 项目项
Bamboo 随机运行不同版本的 msbuild.exe 并构建失败