【问题标题】:"ResolveAssemblyReference" task fails and System.BadImageFormatException, but assembly isn't used anywhere!“ResolveAssemblyReference”任务失败并且 System.BadImageFormatException,但在任何地方都没有使用程序集!
【发布时间】:2011-01-31 05:56:37
【问题描述】:

我收到关于程序集“C:\Ora10g\bin\Zip.exe”的错误。问题是这个解决方案根本不使用 Oracle 中的任何东西。我在项目的任何地方都找不到对 10g 的单一引用。我从另一个离开我们小组的人那里继承了这个。他从来没有遇到过这个问题。我团队的另一位成员说他以前得到过这个,但重新安装 10g 的客户端部分修复了它。那里没有这样的运气。我什至尝试使用 WinGrep 在整个解决方案文件夹中搜索“Ora10g”,但它不存在。

有什么想法吗?在弄清楚如何摆脱对 Oracle 的这种错误引用之前,我无法构建此解决方案。

VS 2005 解决方案。包含几个 WinForm 应用程序、几个类库和一个 Web 服务。错误出现在主类库项目中。

这是错误信息:

Error   1   The "ResolveAssemblyReference" task failed unexpectedly.
System.BadImageFormatException: Could not load file or assembly 'C:\Ora10g\bin\Zip.exe' or one of its dependencies. The module was expected to contain an assembly manifest.
File name: 'C:\Ora10g\bin\Zip.exe'
   at System.Reflection.AssemblyName.nGetFileInformation(String s)
   at System.Reflection.AssemblyName.GetAssemblyName(String assemblyFile)
   at Microsoft.Build.Shared.AssemblyNameExtension.GetAssemblyNameEx(String path)
   at Microsoft.Build.Tasks.SystemState.GetAssemblyName(String path)
   at Microsoft.Build.Tasks.Resolver.FileMatchesAssemblyName(AssemblyNameExtension assemblyName, Boolean isPrimaryProjectReference, Boolean wantSpecificVersion, Boolean allowMismatchBetweenFusionNameAndFileName, String pathToCandidateAssembly, ResolutionSearchLocation searchLocation)
   at Microsoft.Build.Tasks.Resolver.ResolveAsFile(String fullPath, AssemblyNameExtension assemblyName, Boolean isPrimaryProjectReference, Boolean wantSpecificVersion, Boolean allowMismatchBetweenFusionNameAndFileName, ArrayList assembliesConsideredAndRejected)
   at Microsoft.Build.Tasks.Resolver.ResolveFromDirectory(AssemblyNameExtension assemblyName, Boolean isPrimaryProjectReference, Boolean wantSpecificVersion, String[] executableExtensions, String directory, ArrayList assembliesConsideredAndRejected)
   at Microsoft.Build.Tasks.AssemblyFoldersResolver.Resolve(AssemblyNameExtension assemblyName, String rawFileNameCandidate, Boolean isPrimaryProjectReference, Boolean wantSpecificVersion, String[] executableExtensions, String hintPath, String assemblyFolderKey, ArrayList assembliesConsideredAndRejected, String& foundPath, Boolean& userRequestedSpecificFile)
   at Microsoft.Build.Tasks.AssemblyResolution.ResolveReference(IEnumerable`1 jaggedResolvers, AssemblyNameExtension assemblyName, String rawFileNameCandidate, Boolean isPrimaryProjectReference, Boolean wantSpecificVersion, String[] executableExtensions, String hintPath, String assemblyFolderKey, ArrayList assembliesConsideredAndRejected, String& resolvedSearchPath, Boolean& userRequestedSpecificFile)
   at Microsoft.Build.Tasks.ReferenceTable.ResolveReference(AssemblyNameExtension assemblyName, String rawFileNameCandidate, Reference reference)
   at Microsoft.Build.Tasks.ReferenceTable.ResolveAssemblyFilenames()
   at Microsoft.Build.Tasks.ReferenceTable.ComputeClosure()
   at Microsoft.Build.Tasks.ReferenceTable.ComputeClosure(DependentAssembly[] remappedAssembliesValue, ITaskItem[] referenceAssemblyFiles, ITaskItem[] referenceAssemblyNames, ArrayList exceptions)
   at Microsoft.Build.Tasks.ResolveAssemblyReference.Execute(FileExists fileExists, DirectoryExists directoryExists, GetDirectories getDirectories, GetAssemblyName getAssemblyName, GetAssemblyMetadata getAssemblyMetadata, GetRegistrySubKeyNames getRegistrySubKeyNames, GetRegistrySubKeyDefaultValue getRegistrySubKeyDefaultValue, GetLastWriteTime getLastWriteTime)
   at Microsoft.Build.Tasks.ResolveAssemblyReference.Execute()
   at Microsoft.Build.BuildEngine.TaskEngine.ExecuteTask(ExecutionMode howToExecuteTask, Hashtable projectItemsAvailableToTask, BuildPropertyGroup projectPropertiesAvailableToTask, Boolean& taskClassWasFound)

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

【问题讨论】:

    标签: c# .net oracle badimageformatexception


    【解决方案1】:

    当您重新安装 Oracle 客户端时,您将它放在哪里?如果您使用安装程序中的默认位置,您的 ORACLE_HOME 将不在 c:\ora10g。目录 c:\ora10g\bin 是否存在?

    一种可能的解决方法是创建目录 c:\ora10g\bin,然后从那里的 ORACLE_HOME\bin 目录中复制 zip.exe 文件。您的项目中显然有一些内容引用了该特定位置的 Oracle zip 二进制文件(无法帮助您)。

    【讨论】:

    • 该目录存在并且里面有文件。唯一的区别是文件夹是 BIN 而不是 bin。问题是这个解决方案根本不(或不应该)使用这个文件。我在任何地方都找不到对它的任何引用,尤其是在引发错误的库中。
    【解决方案2】:

    此文件可能被您引用的程序集之一引用,从而导致间接依赖。

    检查文件是否存在于目录中,如果存在,请确保该文件也存在于构建服务器中。

    【讨论】:

    • 文件存在,没有构建服务器。
    【解决方案3】:

    赠品是“该模块应包含程序集清单”以及异常类型为System.BadImageFormatException 的事实。有些东西正在尝试加载文件“C:\Ora10g\bin\Zip.exe”,就好像它是一个 .net 程序集一样:

    • 不是 .net 程序集
    • 是一个 .net 程序集,但用于 CLR 的版本晚于您的目标版本
    • 是一个 .net 程序集,但“位数”错误(不太可能给出异常消息的“程序集清单”部分)。
    • 已损坏

    你有没有:

    1. 在文本编辑器中检查了您的解决方案文件 (.sln) 以查找对该文件的引用?
    2. (更有可能) 检查了类库的 .csproj 文件,看它是否包含对该程序的任何引用?可能是有一个自定义 MSBuild 任务正在尝试加载该 EXE,可能是为了从构建过程中生成 ZIPped 输出。
    3. 确认您加载的程序集没有直接或间接引用 Zip.exe 文件?
    4. 作为Dave Van den Eynde said,您是否检查过系统 .targets 文件(告诉 MSBuild 如何执行操作的文件)未更改?您可以在%windir%\Microsoft.NET\Framework\v2.0.50727 中找到这些文件

    您可以尝试的其他方法:

    1. 按照错误消息中的说明打开程序集绑定登录,然后查看日志以查看作为依赖项加载的 Zip.exe。
    2. “Grep”你的整个硬盘驱动器的“zip.exe”,某处某处引用它,它可能不在您的项目/解决方案中(参见第 4 点),但它可能在 Oracle 安装程序的其他地方客户端已损坏/更改。

    【讨论】:

    • @Ramesh,谢谢 :) 在我知道它有多么令人沮丧之前,我自己已经完成了一个“做了一些奇怪的事情”的项目文件。我正在使用的那个是调用一个 EXE,卡巴斯基认为这意味着 DEVENV 表现出病毒行为并立即关闭它。它让我疯狂地努力锻炼!那时我不知道 MSBuild - 不用说我现在对它了解得更多......
    • 另一个团队成员说他通过重新安装 Oracle 解决了这个问题。那对我不起作用。我在项目文件中找不到对 Oracle 的任何引用。我的猜测是某些东西被破坏了。无论如何,我按照我们的计划升级到了 VS2008,除了更改 XSD 文件的名称之外,一切似乎都还不错。我能够毫无错误地构建。升级过程中会发生什么可能会影响项目?
    • 升级过程可能会去掉自定义构建任务(尽管这会让我感到惊讶,因为这对于任何有自定义构建任务的人来说都是一个主要问题)。我认为这是环境问题,但如果不挑选你的机器,升级前,真的很难说。可能是您在 GAC 中有一些引用 zip.exe 的东西,在 VS2k8 安装期间被替换了……我想我们永远不会知道!至少升级解决了你的问题:)
    • 如果它在 GAC 中会不会影响其他项目?我们有 5 或 6 个非常相似并使用相同的内部开发框架。我原以为 GAC 中的某些东西也会在其他项目中被绊倒。至少升级成功了。我想我将不得不忍受不知道它是如何一开始就搞砸的谜团!是否有“分析”GAC 的工具?
    【解决方案4】:

    另外,请确保没有任何官方 Targets 文件被更改。这些会自动导入到您的构建环境中。也许您也可以对它们进行 grep 操作?

    更具体地说,您的前任可能已经修改了它们,以便在他的所有项目中包含某种构建步骤。

    【讨论】:

      【解决方案5】:

      您的应用程序实际上是否在 c:\ora10g 目录中?如果是这样,.Net 将尝试加载 \bin 目录中的每个程序集,无论您是否实际引用它。

      【讨论】:

      • 我所有的项目都在不同的目录中。 C:\Visual Studio 2005\Projects.
      猜你喜欢
      • 2016-04-21
      • 2020-07-19
      • 2020-10-03
      • 2020-06-28
      • 2021-03-21
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多