问题
I'm using PostSharp, and this was working fine. Recently, we upgraded some projects to the MVC version 5.2. Today, I loaded up an old project which was using version 4.0 of MVC. PostSharp started reporting a strange error on build:
Error 17 Unhandled exception (3.1.42.0, 32 bit, CLR 4.5, Release): PostSharp.Sdk.CodeModel.AssemblyLoadException: Cannot find assembly 'system.web.mvc, version=3.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35'. [Version mismatch]
============ PostSharp Assembly Loading Log ===================
LOG: Finding the assembly with binding identity 'system.web.mvc, version=3.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35'.
LOG: Found file 'C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Mvc.dll' with identity 'system.web.mvc, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35, processorarchitecture=msil'.
LOG: Reference mismatch for 'C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Mvc.dll' [VersionMismatch].
LOG: Probing location 'C:\ProgramData\PostSharp\3.1.42\bin.Release\System.Web.Mvc.exe' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\ProgramData\PostSharp\3.1.42\bin.Release\System.Web.Mvc.dll' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\ProgramData\PostSharp\3.1.42\bin.Release\System.Web.Mvc.winmd' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\bin\Debug\System.Web.Mvc.exe' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\bin\Debug\System.Web.Mvc.dll' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\bin\Debug\System.Web.Mvc.winmd' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\obj\Debug\System.Web.Mvc.exe' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\obj\Debug\System.Web.Mvc.dll' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\obj\Debug\System.Web.Mvc.winmd' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.Mvc.exe' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.Mvc.dll' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.Mvc.winmd' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Web.Mvc.exe' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Web.Mvc.dll' because this directory was explicitly added to the search path [File Not Found].
LOG: Probing location 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Web.Mvc.winmd' because this directory was explicitly added to the search path [File Not Found].
LOG: Looking in GAC for System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=x86.
LOG: Looking in GAC for System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=msil.
LOG: Looking in GAC for System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: The assembly 'system.web.mvc, version=3.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35' was not found.
===============================================================
at PostSharp.Sdk.CodeModel.Domain.GetAssembly(IAssemblyName assemblyName, BindingOptions bindingOptions)
at PostSharp.Sdk.CodeModel.AssemblyRefDeclaration.^5YpB0scd(BindingOptions _0)
at PostSharp.Sdk.CodeModel.AssemblyRefDeclaration.GetAssemblyEnvelope(BindingOptions bindingOptions)
at PostSharp.Sdk.CodeModel.TypeRefDeclaration.GetTypeDefinition(BindingOptions bindingOptions)
at PostSharp.Sdk.CodeModel.TypeRefDeclaration.GetTypeDefinition()
at PostSharp.Sdk.CodeModel.CompareExtensions.DefinitionMatchesReference(INamedType definition, INamedType reference, BindingOptions options)
at PostSharp.Sdk.CodeModel.TypeRefDeclaration.^A9yFoe2uB3TC(ITypeSignature _0, BindingOptions _1)
at PostSharp.Sdk.CodeModel.CompareExtensions.DefinitionMatchesReference(IMethodSignature definition, IMethodSignature reference, BindingOptions options)
at PostSharp.Sdk.CodeModel.Binding.MethodSignatureComparer.Equals(IMethodSignature x, IMethodSignature y)
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at ^/vWxD3eYDOIx.^wdkNIZCy[??0](^/fRRnkiTvxqu _0, ??0 _1, ^EyL1LQX01Ck8 _2, ^0RC0kpHqS6Uy _3, Dictionary`2 _4, Int32 _5, Int32 _6)
at PostSharp.Sdk.Binary.ModuleWriter.SetMemberSignatureIndex(MemberRefDeclaration _0, ^EyL1LQX01Ck8 _1, ^0RC0kpHqS6Uy _2)
at PostSharp.Sdk.Binary.ModuleWriter.WriteMemberRef(MemberRefDeclaration _0, MetadataToken _1)
at PostSharp.Sdk.Binary.ModuleWriter.GetMappedDeclarationToken(MetadataDeclaration _0)
at PostSharp.Sdk.Binary.ModuleWriter.SetMappedMetadataToken(MetadataDeclaration _0, UInt32* _1)
at ^R00FfLNj7vE0.^rk33N/hO(OpCodeNumber _0, MetadataDeclaration _1)
at ^R00FfLNj7vE0.EmitInstructionMethod(OpCodeNumber _0, IMethod _1)
at PostSharp.Sdk.CodeModel.Instruction.Write(BaseInstructionWriter writer, InstructionPrefixes allowedPrefixes)
at ^zpGNRK5nUM9z.^x98p/iJs13L+(InstructionReader _0)
at PostSharp.Sdk.CodeModel.MethodBodyDeclaration.^uPrQJ6gs(InstructionBlock _0, IMethodBodyVisitor[] _1, MethodBodyVisitLevel _2, InstructionAction _3, InstructionReader _4, InstructionBlockExceptionHandlingKind _5)
at ^zpGNRK5nUM9z.^e2BtLyuT(^Kh85h0nXrulm& _0, Int32& _1)
at ^zpGNRK5nUM9z.^SkiT(BufferWriter _0)
at PostSharp.Sdk.Binary.ModuleWriter.WriteMethodBodies(BufferWriter _0, UInt32 _1)
at ^Up6wxUIUnN6a.^VfvrABjR()
at ^Up6wxUIUnN6a.^SkiT()
at ^cyC/TYSlPGB/.^wvPm(^RtksFin57NJ8 _0, ^8gP93Xsl\+Imn _1)
at PostSharp.Sdk.Extensibility.Tasks.CompileTask.Execute()
at PostSharp.Sdk.Extensibility.Project.ExecutePhase(String phase)
at PostSharp.Sdk.Extensibility.Project.Execute()
at PostSharp.Hosting.PostSharpObject.ExecuteProjects()
at PostSharp.Hosting.PostSharpObject.InvokeProject(ProjectInvocation projectInvocation). C:\Work\Work\CodeBase\C#\CS\+Frameworks\v5\BusinessLogic_CS_v5\BusinessLogic_CS_v5.csproj BusinessLogic_CS_v5
I went through all the project references, and there is no project which references system.web.mvc, version=3.0.0.0
. All of the projects reference 4.0.0.0
. Why is it mentioning version 3.0.0.0? Is it maybe finding it from some GAC or some local installation?
If I disable PostSharp from the project properties, project compiles successfully. So it must be something related to PostSharp. Any help would be greatly appreciated as I'm lost about
回答1:
This error is usually raised when some of the 3-rd party assemblies references older version of System.Web.Mvc. You have the binding redirect in your web.config, but you also need to tell PostSharp to use that configuration during build. You can do it by setting PostSharpHostConfigurationFile
build property to the path of your *.config file.
<PropertyGroup>
<PostSharpHostConfigurationFile>web.config</PostSharpHostConfigurationFile>
</PropertyGroup>
回答2:
Add the code below inside your [project].csproj file. To achieve this follow the steps:
- Right-click in your Project;
- Unload Project;
- Then right-click in unloaded project and click Edit [project].csproj;
- Look for a tag
<Import Project
of PostSharp; - Then add the following code right below the
<Import Project .../>
tag; - Then Reload the project;
Code:
<PropertyGroup>
<PostSharpHostConfigurationFile>web.config</PostSharpHostConfigurationFile>
</PropertyGroup>
Your xml code should look something like:
<Import Project="..\..\packages\PostSharp.4.0.42\tools\PostSharp.targets" Condition="Exists('..\..\packages\PostSharp.4.0.42\tools\PostSharp.targets')" />
<PropertyGroup>
<PostSharpHostConfigurationFile>web.config</PostSharpHostConfigurationFile>
</PropertyGroup>
回答3:
Postsharp may be referencing MVC 3 internally. You can try a binding redirect in your web.config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
来源:https://stackoverflow.com/questions/26146922/issue-with-postsharp-cannot-find-assembly-for-system-web-mvc-version-3-0-0-0-wh