无法加载文件或程序集 PDFsharp

Posted

技术标签:

【中文标题】无法加载文件或程序集 PDFsharp【英文标题】:Could not load file or assembly PDFsharp 【发布时间】:2018-10-17 20:05:02 【问题描述】:

这是一个很长的错误,但我会告诉你关键细节。因此,假设我发布了一个包含 PDFsharp 库的 C# 应用程序,但我使用它们的函数很少,这就是我得到错误的地方。

我尝试创建多个 PDF(通过 Crystal Report 并将它们导出为 PDF),然后将这些多个合并为一个。还没有错误。合并时我正在使用 PDFsharp 函数,我将包含下面的代码以澄清,这是棘手的部分,代码工作得很好,合并 PDF 并且只在我的 PC 上执行所有操作,我试图将应用程序 (.exe) 提供给某人否则并让它们在他们的 PC 上运行,他回来时合并功能出错。

另外,仅供参考:PDF 正在创建,只有合并是一个问题,这意味着程序无法找到它需要合并的文件,它正在寻找一些它无法找到的 PDFsharp 库寻找。现在,该错误没有任何意义,因为据我所知,当应用程序发布时,它会将所有库本身绑定,这样其他用户就不必包含它们。我还包括其他库,它们没有给出任何错误,因此我们可以得出结论,PDFsharp 出了点问题。

错误:System.IO.FileNotFoundException:无法加载文件或程序集 'PdfSharp, Version=1.32.3057.0, Culture=neutral, PublicKeyToken=f94615aa0424f9eb' 或其依赖项之一。

另一个仅供参考:我已经记录了所有错误并尝试了程序集绑定、IIS 应用程序池、在不同 CPU 上发布以及几乎所有内容,所以请想出一些可行的方法!

这是我的合并代码(取自其他来源):

using (PdfDocument targetDoc = new PdfDocument())

    foreach (string pdf in pdfs)
    
        using (PdfDocument pdfDoc = PdfSharp.Pdf.IO.PdfReader.Open(pdf, 
               PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import))
        
            for (int i = 0; i < pdfDoc.PageCount; i++)
            
                targetDoc.AddPage(pdfDoc.Pages[i]);
            
        
    
    targetDoc.Save(targetPath);

【问题讨论】:

你是如何添加你的程序集的? bin 文件夹中的程序集文件可用吗? 我通过 NuGet 包添加,是的,当我打开 bin\debug 时:我确实看到了 PDFSharp dll 和一些额外的支持 PDFSharp 文件。 您是否尝试过在您的 IIS 应用程序池中启用 32 位支持?我似乎记得在我们开发的一个旧应用程序中使用了它。 是的,我做了,没用。 bin文件夹中的程序集版本是否与异常中的相同? 【参考方案1】:

您必须将文件 PdfSharp.dll 与您的 .EXE 文件(以及 PdfSharp.dll 引用的所有程序集)一起提供。您的 .EXE 不包含您在编译时引用的其他程序集的代码,因此这些其他程序集必须在运行时存在。

顺便说一句:您使用的是 2013 年左右的 1.32 版,因此您错过了过去五年的所有错误修复。

现在,这个错误没有任何意义,因为据我所知,当一个应用程序发布时,它会绑定所有的库,这样其他用户就不必包含它们。

这对我来说是新的。该信息的任何参考资料?我假设错误消息是正确的,而您的假设是错误的...... 适用于 C/C++ 的 LIB 库的情况不适用于 Windows DLL 文件。 DLL 在运行时加载,因此它们必须存在于运行应用程序的计算机上。

【讨论】:

如果您需要发布包含所有依赖项的单个可执行文件,请添加对 Costura.Fody 的引用。这将无缝地包含依赖的 DLL 作为资源并在运行时加载它们。否则,将 DLL 与可执行文件一起提供。仅当目标计算机的 GAC 中已存在确切引用的版本时,才不需要分发库。 不需要添加 system.diagnostics 的原因是命名空间存在于 system.dll 文件中,该文件已作为 dotnet 框架的一部分存在于 GAC 中。当使用第三方 dll,例如“PdfSharp.dll”时,它需要存在于 bin 文件夹中。 @HarshitArora 当我为我正在处理的应用程序调用“发布”时,我得到一个包含 70 个文件的文件夹,其中包括许多 System.*.dll 文件。如果系统 DLL 不在程序文件夹中,那么它们仍然必须在计算机上,因为它们仍然在运行时加载。 C/C++ 使用 LIB 格式的库,这些库被合并到 EXE 文件中。 DLL 在运行时加载——即使在上个世纪我们使用 C/C++ 创建 Windows 应用程序时也是如此。 DLL = 动态链接库(在运行时加载)en.wikipedia.org/wiki/Dynamic-link_library

以上是关于无法加载文件或程序集 PDFsharp的主要内容,如果未能解决你的问题,请参考以下文章

Word VSTO 4.0 插件无法加载:无法加载文件或程序集

无法加载文件或程序集 'PayPalAdaptivePaymentsSDK,版本 = 2.12.117.0

能加载文件或程序集“Aspose.Cells”或它的某一个依赖项。无法验证强名称签名

无法加载文件或程序集'netstandard,版本 = 2.0.0.0

寻找解决策略:无法加载文件或程序集[重复]

无法加载文件或程序集。找到的程序集的清单定义与程序集引用不匹配