AspNetCompiler - 尝试使用不正确的格式

时间:2016-02-08 02:14:54

标签: c# .net compilation compiler-errors badimageformatexception

我正在构建一个仅64位的Web应用程序(AssemblyA)并引用我构建的另一个应用程序,该应用程序也只是64位(AssemblyB)。

当我在AssemblyB中添加AssemblyA作为引用时,我在Visual Studio中遇到以下编译错误:

  

ASPNETCOMPILER无法加载文件或程序集“AssemblyB”或其依赖项之一。试图加载格式不正确的程序。

我的应用程序的平台目标设置均设置为x64,目标框架设置均为.Net Framework 4.6Prefer 32bit is unchecked

我尝试在AssemblyB中引用AssemblyA的每个相关引用,确保所有相关引用的版本都相同。

我使用了这个问题:How to determine if a .NET assembly was built for x86 or x64?确认所有引用的程序集都是MSILAMD64

我使用aspnet_compiler.exe命令行工具并启用了errorstack选项,并获得了以下堆栈跟踪:

  

[BadImageFormatException]:无法加载文件或程序集“AssemblyB”或其依赖项之一。试图加载格式不正确的程序。

     

at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntro spection,Boolean suppressSecurityChecks)

     

at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName,String code Base,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& s tackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntros pection,Boolean suppressSecurityChecks)

     

at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)

     

在System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,   证据assemblySecurity,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean forIntrospection)

     

at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection)

     

在System.Reflection.Assembly.Load(String assemblyString)

     

at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean starDirective)

     

[ConfigurationErrorsException]:无法加载文件或程序集“AssemblyB”或其依赖项之一。试图加载格式不正确的程序。

     

at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean starDirective)

     

at System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomain BinDirectory()

     

在System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai)

     

在System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)

     

at System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies()

     

at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStar tInitListPath,Boolean& isRefAssemblyLoaded)

     

在System.Web.Compilation.BuildManager.ExecutePreAppStart()

     

在System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,Host ingEnvironmentParameters hostingParameters,PolicyLevel policyLevel,Exception appDomainCreationException)

我查看了以下相关问题,没有人回答这个问题。大多数都与IIS配置有关,但这不是一个例子,因为这是一个编译错误,或者有一个解决方案是将项目设置为允许32位平台目标,这不适合我的情况:

我不知道从哪里开始。重申一下,我想要将我的任一项目设置为32位,这不是IIS配置的问题,因为这是编译错误。

我也在几台不同的机器和全新的应用程序上尝试了相同的结果。

如何修复此编译错误?

1 个答案:

答案 0 :(得分:1)

指令<AspNetCompiler />的参数ToolPath可以指向aspnet_compiler.exe的64位版本。 this blogpost中对此进行了描述。要点,请编辑您的csproj文件:

ToolPath属性添加到AspNetCompiler节点:

 <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)" ToolPath="$(AspNetToolPath)" />

在定义了MvcBuildViews的地方,添加属性FrameworkVersionAspNetToolPath,如下所示:

<MvcBuildViews>true</MvcBuildViews>
<FrameworkVersion>v4.0.30319</FrameworkVersion>
<AspNetToolPath Condition=" '$(Platform)' == 'x64'">$(windir)\Microsoft.NET\Framework64\$(FrameworkVersion)</AspNetToolPath>