My solution contains some .net projects and one of them is a ASP.NET MVC project, which I'm trying to publish. All configurations are set correctly, x32 and x64, non of them is set to AnyCPU.
Problem:
If I try to publish the project as 32bit, everything is fine, but trying to publish in 64 bit mode fails with an error:
Could not load file or assembly "ProjectA" or one of its dependencies.
An attempt was made to load a program with an incorrect format.
What I've tried and noticed:
Since VS 2013, MSbuild is a part of VS and not of .NET Framework as before. If I simply build the solution in x64 mode, the 32 bit msbuild "C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe"
is runnig first and it launches the 64bit msbuild "C:\Program Files (x86)\MSBuild\12.0\Bin\amd64\MSBuild.exe"
So normal build without publish works just fine.
But, if I choose publish
, the 32bit MSbuild is running first and then it launches the 32 bit aspnet_compiler c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe
and NOT the 64 bit one, which causes an error which I mentioned above.
The only workaround I've found until now is to replace the
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe"
with a 64 bit one
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe"
Question:
Is there any better (legal) solution for my problem? This looks like a bug in VS
From the BUILD menu in Visual Studio, select Configuration Manager. From the Active solution platform drop-down list, select New. The New Solution Platform dialog displays. In the Type or select new platform combination box, select x64.
(Because Visual Studio is a 32-bit application, when it is installed on a 64-bit system, it runs under WOW64.)
Here's why it matters. Simply put, a 64-bit processor is more capable than a 32-bit processor because it can handle more data at once. A 64-bit processor can store more computational values, including memory addresses, which means it can access over 4 billion times the physical memory of a 32-bit processor.
The 32 bit version can be found at c:\program files (x86)\IIS Express\iisexpress.exe and the 64 bit version can be found at c:\program files\IIS Express\iisexpress.exe . IIS Express ignores the enable32BitAppOnWin64 attribute. To run the app pool as 32 bit, you must execute the 32 bit version of IIS Express.
Add this line to the .csproj file within a PropertyGroup
node for the build configuration you are targeting (or use the ProperyGroup
that doesn't have a target to target all release modes).
<AspnetCompilerPath>$(windir)\Microsoft.NET\Framework64\v4.0.30319</AspnetCompilerPath>
The 64-bit version is then used by the compiler. For me, the node I added this line to was as below:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<AspnetCompilerPath>$(windir)\Microsoft.NET\Framework64\v4.0.30319</AspnetCompilerPath>
</PropertyGroup>
I have exactly the same problem.
You can create BAT-files to replace the EXE before you start your publish. or Or you could write a BAT that calls the aspnet_compiler.exe directly and does the publish without the UI :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With