如何使用 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 个解决方案平台,x86x64。我在我的解决方案目录中创建了一个名为“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的主要内容,如果未能解决你的问题,请参考以下文章

在 x86 中编译引用 C++/CLI DLL 的 C# 项目时,MSBuild 无法构建

msbuild 包中不包含 C# 孙项目 DLL

Visual Studio/MSBuild 将引用的类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹

在使用 CreateObject 从 VBScript 中通过 COM 引用 C++ DLL 时,如何处理 DLL 版本?

从Visual Studio构建定义UI添加MSBuild的引用搜索文件夹

VS 2017 - 带有版本信息(资源)的 C++ DLL 的 MSBuild 不起作用(致命错误 LNK1158:无法运行“cvtres.exe”)