我已经构建了一个使用PDFium打印PDF文档的WinForms应用程序。我从NuGet安装了PDFium,它在我的项目中创建了两个子文件夹 - x86和x64 - 正如预期的那样,每个都有pdfium.dll的相关版本。我的应用程序的目标平台设置为 Any CPU 。
当我在Windows 10 64位计算机上运行调试应用程序时,它运行良好。但是,当我发布应用程序并在同一台计算机上安装它时,PDFium会抛出异常:
System.BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)
在做了一些研究后,我将应用程序的目标平台更改为x86,并从我的项目中删除了x64子文件夹。该应用程序现在在发布后完美运行,因此问题得以解决。
但是,我想知道是否有一种方法可以让我的应用程序工作,以便它支持x86和x64,使用适用于目标计算机的PDFium版本。如果它能够在可以支持它的机器上安装64位版本(这是我们组织中的大多数,但是如果我有的话,我觉得我需要使用32位),这样会很好。选择其中一个,以确保兼容性。
答案 0 :(得分:5)
我使用过这种方法。主要思想是确定程序是在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);
答案 1 :(得分:0)
事实证明这与PDFium没有任何关系。在安装已发布应用程序期间使用的脚本中,两个版本的pdfium.dll都设置为发布到应用程序的根文件夹,而不是名为x32和x64的子文件夹。因此,在安装过程中,x32版本的dll会覆盖x64版本,导致应用程序根本没有x64 dll。