无法为 x64 和 x86 加载文件或程序集 'CefSharp.Wpf;只有一个作品
Posted
技术标签:
【中文标题】无法为 x64 和 x86 加载文件或程序集 \'CefSharp.Wpf;只有一个作品【英文标题】:Could not load file or assembly 'CefSharp.Wpf for both x64 and x86; only one works无法为 x64 和 x86 加载文件或程序集 'CefSharp.Wpf;只有一个作品 【发布时间】:2015-09-19 05:50:37 【问题描述】:当我跑步时,我得到:Could not load file or assembly 'CefSharp.Wpf, Version=41.0.0.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138' or one of its dependencies. An attempt was made to load a program with an incorrect format.
这意味着问题是由于 dll 的位数不正确。
在版本 41.0.0 中,nuget 包添加了指向正确路径(x86 文件夹)的 x86 版本的 dll 引用。还有另一个 dll 副本指向属性面板中的空路径。问题是 x64 版本由于引用了 x86 版本的 dll 而崩溃并出现错误图像错误。
我已经回溯到 39.0.2,CefSharp 为我工作。我有两组 dll,并且我的应用程序的 x86 和 x64 版本可以按预期编译和运行。
当我再次升级到 41.0.0 时,问题与以前相同。虽然应用程序使用 x86 版本的 dll 会在尝试显示第一个浏览器时崩溃,但 x64 版本将编译。我试图重建所有以及删除自动复制的dll,并且在编译期间再次复制x86版本。 (至少我相信是这样的一个
然后我删除了引用中的所有 dll 并手动添加了 x64 版本。编译和执行与 39.02 版本的 CefSharp.WPF 一样正常工作。
如何在不手动更改 dll 路径的情况下让两个版本都工作?
另一个注意事项:我可以在设置为 x64 时使用 nuget,这与上述问题相反。现在 x64 可以工作,而 x86 不行。 dll 的路径现在是 x64 文件夹。
【问题讨论】:
github.com/cefsharp/CefSharp.MinimalExample 项目是否可以重现问题?在39.0.2
和41.0.0
之间,Nuget
包结构没有发生任何变化,这实际上是对CefSharp
的一个非常小的升级(显然是对新的CEF
版本的重大升级)。
我会看看该项目是否会发生这种情况。虽然我可能要到星期一才能完成。
如果我在编译完成后手动复制文件,构建将执行并正确运行。看起来好像构建正在复制错误版本的文件(x86 版本总是被复制)。我在哪里可以找到这个?
复制由一个msbuild目标github.com/cefsharp/CefSharp.MinimalExample/blob/master/…
您向我指出了有助于找到参考问题的项目文件。谢谢@amaitland。
【参考方案1】:
事实证明,在经历了很多磨难和痛苦之后,我发现我的 .csproj
中的引用设置不正确。它们以某种方式被定义为 x64。
<Reference Include="CefSharp, Version=41.0.0.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<!--<HintPath>..\packages\CefSharp.Common.41.0.0\CefSharp\x64\CefSharp.dll</HintPath>-->
</Reference>
<Reference Include="CefSharp.Core, Version=41.0.0.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<!--<HintPath>..\packages\CefSharp.Common.41.0.0\CefSharp\x64\CefSharp.Core.dll</HintPath>-->
</Reference>
<Reference Include="CefSharp.Wpf, Version=41.0.0.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<!--<HintPath>..\packages\CefSharp.Wpf.41.0.0\CefSharp\x64\CefSharp.Wpf.dll</HintPath>-->
</Reference>
我一注释掉HintPath
,它就开始正常工作。请注意,实际引用由项目顶部的Import
定义。
<Import Project="..\packages\CefSharp.Wpf.41.0.0\build\CefSharp.Wpf.props" Condition="Exists('..\packages\CefSharp.Wpf.41.0.0\build\CefSharp.Wpf.props')" />
<Import Project="..\packages\CefSharp.Common.41.0.0\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.41.0.0\build\CefSharp.Common.props')" />
这些.props
文件设置了实际的HintPath
,这是将正确的.dlls
复制到构建文件夹所必需的。我不确定我的项目如何以错误的路径设置结束。
【讨论】:
相对较旧的版本存在问题,这意味着 nuget 没有引入正确的引用(尤其是在没有首先选择“位”解决方案时)。【参考方案2】:使用 Visual Studio 2017,winforms 应用程序,我在一台机器上升级 Nuget 包后遇到错误,上传到 Github,然后在另一台机器上,我执行了 git a Pull 以在那里更新我的解决方案文件。导致第二台机器出现上述错误。
补救措施: 删除 /bin 和 /obj 中的文件夹。 重建解决方案。
【讨论】:
以上是关于无法为 x64 和 x86 加载文件或程序集 'CefSharp.Wpf;只有一个作品的主要内容,如果未能解决你的问题,请参考以下文章
将 MVC 项目“任何 CPU”转换为 x64 - 无法加载程序集
未能加载文件或程序集“********”或它的某一个依赖项。试图加载格式不正确的程序。
跨平台程序集 ((x64 || x86) && (Microsoft x64 || SystemV))