我已经构建了一个WinForms应用程序,它使用PDFium打印PDF文档。我从NuGet安装了NuGet,它在我的项目中创建了两个子文件夹-- x86和x64 --这两个子文件夹都有相应版本的pdfium.dll。我的应用程序的目标平台被设置为任意CPU。
当我在我的Windows 10 64位计算机上运行调试应用程序时,它运行得非常完美。但是,当我发布应用程序并在同一台计算机上真正安装它时,PDFium抛出一个异常:
System.BadImageFormatException:尝试加载格式不正确的程序。(HRESULT例外: 0x8007000B)
在进行了一些研究之后,我将应用程序的目标平台更改为x86,并从我的项目中删除了x64子文件夹。现在应用程序在发布后工作得很好,所以问题得到了解决。
但是,我想知道是否有一种方法可以让我的应用程序工作,以便它同时支持x86和x64,为目标计算机使用合适的PDFium版本。如果它能在能够支持它的机器上安装64位版本(这是我们组织中的大多数版本,但我觉得如果我必须选择其中一种或另一种,以确保兼容性),我觉得我需要使用32位。
发布于 2017-03-27 13:47:03
事实证明,这与PDFium无关。在我安装发布的应用程序期间使用的脚本中,两个版本的pdfium.dll都被设置为发布到应用程序的根文件夹,而不是名为x32和x64的子文件夹。因此,在安装过程中,dll的x32版本将覆盖x64版本,从而导致应用程序根本没有x64 dll。
发布于 2017-03-27 12:42:58
我用过这种方法。其主要思想是确定程序是在32位还是64位环境中运行。这是通过检查指针的大小来完成的。根据检查的结果,库pdfium.dll
是从应用程序路径的x86
或x64
子目录中动态加载的。
private static bool TryLoadNativeLibrary(string path)
{
if (path == null)
return false;
path = Path.Combine(path, IntPtr.Size == 4 ? "x86" : "x64");
path = Path.Combine(path, "pdfium.dll");
return File.Exists(path) && LoadLibrary(path) != IntPtr.Zero;
}
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
https://stackoverflow.com/questions/43046641
复制相似问题