Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reference different version of dll with MSBuild

I have a web application project which utilises a set of 3rd party dll's. The issue is that the dev/staging environment is 32bit, but production is 64bit. As such, we have to re-reference and build the solution each time we want to deploy. I am now wanting to automate this, but unsure how to go about it with MSBuild?

All other dll's are the same, just the 3 3rd party dll's.


EDIT

I have made some headway, however am coming up with some runtime assembly issues.

I have 3 dll files, 1.dll, 2.dll, 3.dll. The file version is 5.1 for each. For the 64 bit dlls, the names are exactly the same, just difference file versions. What I have done, is renamed each one to 1.v5.dll, 1.v6.dll etc. In my project files, I am then referencing each dll as follows:

<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> 

This works in Visual Studio IDE, and my solution compiles file, however when I go to run the website, I get the following error...

"Could not load file or assembly '1.v5' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.

Any thoughts on how to approach this?

like image 923
mickyjtwin Avatar asked Jan 04 '10 02:01

mickyjtwin


People also ask

How do you change the version of a DLL file?

For a file that is missing version info completely: After opening the DLL in Visual Studio, go to Edit > Add Resource > Version and click New. Then in the new Version tab, change FILEVERSION and PRODUCTVERSION, CompanyName, etc. Save the files and you're all set!

Can a DLL contain another DLL?

You can certainly embed another DLL as a resource and extract and load it at runtime if that's what you need.

How do I change the reference version in Visual Studio?

Open the project in Visual Studio. Right-click on the project's References folder and select Add Reference to open the Add Reference dialog box. Locate the new assembly version in the Add Reference dialog for each Infragistics assembly listed in your References folder.


2 Answers

You can create conditional references in the project file like this:

<Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/> <Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/> 

To use this inside VS, you have to create two solution platforms: one for the x86 target and one for the x64 target. Depending on the active platform one of the dlls will be selected, no need for re-referencing.

To automate this using msbuild, create a new project file that builds the other project file a number of times, each time for a different platform/configuration/...:

<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> 

Have a look at the MSBuild task reference for aditional options like building in parallel.

like image 59
stijn Avatar answered Sep 18 '22 20:09

stijn


This is what I have figured out, and seems to work no problems.

I have created 2 solution platforms, x86 and x64. I have created a new folder in my solution directory called "References", and created n x86 and x64 folder: \References\x86\ \References\x64\ The 3 dll's for each are then placed in their respective directories.

In each project's file, I have then added the following references:

<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> 

Now, when I develop within the IDE, I am working the the relevant dll specific to my needs.

I have then just added a post-build event which copies the dll based on the $(Platform) variable into the bin directory.

like image 26
mickyjtwin Avatar answered Sep 18 '22 20:09

mickyjtwin