This article is the result of the following problem I encountered a few days ago: We have a piece of software which references a third party dll. We had to deploy the software to a customer with a 64bit server.
This isn’t a problem for the code written in house, as it is all managed so runs in a 64bit environment no problem. Unfortunately, the third party dll we are using is 32 bit specific. There is a 64 bit version, but in order to develop against the library we have to reference the 32 bit dll (we all work on 32 bit machines).
The build setup
We run Continuous Integration using Cruise Control and MSBuild to do the building by reading our solutions files. On every check-in, a build is triggered, resulting in a build containing everything the software needs, ready to deploy.
Fixing the problem
First we deployed the software to a 64 bit server and tried simply copying over the 32 bit dll with the 64 bit version – they are both the same version number, so with fingers crossed we fired up the app. No such luck:
The located assembly's manifest definition does not match the assembly reference
Kind of expected that to be honest...
Then changed the reference in the project file to point to the new location for the 32 bit dll.
The plan was to get the build server to open the project file containing the reference to the 32 bit dll and change the path to the dll so it points at the 64 bit version before building the solution.
VS2008 project files hold their references to dlls as below:
So I simply needed to replace the string
With the relative path to the 64 bit dll
Before MSBuild starts compiling.
A quick and dirty VBScript with a batch file to kick it off takes care of the job of replacing the HintPath in the project file:
' Replace reference to SomLibrary in MyProject project
strFileToFix = "Build64\Services\PDF\MyProject.vbproj"
set fso = wscript.createobject("scripting.filesystemobject")
set txtStr = fso.opentextfile(strFileToFix,1,false,0)
strHolder = txtstr.readall
set txtStr = nothing
strHolder = replace(strHolder,"..\..\BinRefs\32Bit\SomeLibrary.dll","..\..\BinRefs\64Bit\SomeLibrary.dll",1,-1,vbtextcompare)
set txtStr = fso.createtextfile(strFileToFix,true,false)
set txtStr = nothing
Batch Script (Replace32bitDLL.cmd)
Finally a task is added to the project section in the Cruise Control config file before the call to MSBuild (shown in bold):
And you’re sorted. Check-ins result in builds ready to be deployed to 64 bit machines.