在32位和64位处理器上开发,我应该如何构建我的项目以自动引用正确的dll?

5
我目前的情况是,我有32位和64位的开发机器在我的c#项目上工作。 我必须引用一些同时具有32位和64位版本的dll文件。 显然,32位机器需要引用32位dll文件,而64位机器需要引用64位dll文件。 我遇到的问题是,每次开发人员提交代码时,他们也会提交他们的dll引用,因此当另一方拉取他们的代码时,它无法构建,并且必须手动将其引用更新为应该的内容。 然后他们进行提交,其他开发人员必须手动修复他们的引用,以此类推。
我不认为这是一个新问题,但这是我第一次遇到它。 是否有一种常见的做法可以自动引用正确的CPU的dll文件? 或者有没有一种方法可以拥有32位和64位项目,每个项目都有正确的引用,并且有一种方法(可能是命令行工具或某个外部工具,可以与构建绑定),以使它们相互关联,以便在向其中一个添加或删除新项时,另一个也会被更新?
另一种选择是让每个开发人员使用相同的虚拟化开发环境。 如果我选择这条路,我能在32位硬件上虚拟化64位系统吗,还是我必须反过来,虚拟化32位? 这将是一个SaaS产品,因此我只需要为一个处理器部署,而我更喜欢它是64位的。

@David Heffernan 我也这么认为,但我的新问题是如何让开发人员在从源代码控制中拉取时不必手动更新其项目的代码项? - Matthew Vines
3
@Doc Brown 你不能只启动通量电容器,提供1.21GW的能量,然后回到过去消除所有32位计算机的痕迹吗? - David Heffernan
很遗憾,不同名称的dll并不是问题所在,我们并非完全托管,我们大部分的问题都与我们的测试项目有关,该项目使用一个使用非托管代码的内存SQLite数据库。 - Matthew Vines
2
@Doc Brown 我完全同意这是最终的解决方案。不幸的是,我们是全新的并且100%自力更生,我们必须使用手头上已有的硬件,直到我们有一些收入为止。 - Matthew Vines
1
“它无法构建”,这是什么意思?记录错误并更新哪个参考文献。按设计,程序集引用不具有位数依赖性,元数据相同。您只应该遇到易于解决的运行时问题。 - Hans Passant
显示剩余4条评论
3个回答

6

1
谢谢提供链接。这正是我遇到的问题,也是我正在寻找的。我将在周一尝试并告诉您它对我们的效果如何。 - Matthew Vines

2

我有一个类似的问题,但我的解决方案有点不同。我只让所有开发者使用x86 DLL进行开发。

因此,在所有机器上,代码实际上是相同的。然后,在运行时(以及测试时),我使用一个启动器应用程序来测试操作系统并移动DLL,以便在运行时使用适当的DLL。启动器中的逻辑非常简单,类似于:

If IntPtr.Size = 8 Then
  '-- Copy x64 DLLs into position
Else
  '-- Copy x86 DLLs into position
End If

当然,在复制时,您需要将其复制回来,以便始终可以在x64和x86之间切换(对于便携式应用程序而言)。但是,如果您正在安装非便携式应用程序,则没有必要使用启动器,因为此操作系统检查都可以在安装程序内完成(因此只有正确的DLL才会被安装)。
您需要编辑项目文件以使用所需DLL的非特定版本(否则此移动逻辑将无法按照您的意愿执行)。

1
我正在进行类似的任务。我的解决方案是使用预构建事件和特定的资源文件夹。我的32位参考dll放在一个文件夹中,64位放在另一个文件夹中。
del "$(ProjectDir)\dlls*.dll" - 从公共资源文件夹中删除所有dll
xcopy "$(ProjectDir)\CommonResources" "$(ProjectDir)\dlls"/s /i /y - 将公共dll复制到资源文件夹中
以下两个命令将正确的32位或64位dll复制到资源文件夹中
if $(PlatformName) == x64 (xcopy "$(ProjectDir)\dlls-64\My64Bit.dll" $(ProjectDir)\dlls/s /i /y)
if $(PlatformName) == x86 (xcopy "$(ProjectDir)\dlls-32\My32Bit.dll" $(ProjectDir)\dlls/s /i /y)
使用类似的命令进行后构建,将所需的引用复制到输出目录以进行打包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接