.net ClosedXML -未能加载文件或程序集

tag5nh1u  于 2023-03-09  发布在  .NET
关注(0)|答案(6)|浏览(433)

我试图使用ClosedXML在应用程序中生成Excel文档,但是当我试图运行它时,我收到了无法加载文件或汇编服务器错误。

Could not load file or assembly 'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

我见过几种解决方案,包括更改.dll属性中的“Copy Local”值,以及将程序集直接添加到web.config。
我使用的是Visual Studios 2010,dll属性不包括“复制本地”项。然后,当我在Web配置中输入以下程序集时,我仍然收到相同的服务器错误消息。我从提供的错误消息中获得了程序集。

<add assembly="ClosedXML, Version=0.76.0.0, Culture=neutral, PublicKeyToken=fd1eb21b62ae805b"/>
guz6ccqo

guz6ccqo1#

在疯狂地搜索答案并最终发布一个问题之后,我遇到了最简单的答案,一旦我引用了额外的.dll,一切都正常工作。
若要使用ClosedXML,必须引用DocumentFormat.OpenXml.dll:
用于NET 4.0及以上版本的文档格式. OpenXml.dll

rekjcdws

rekjcdws2#

我遇到了同样的问题,但我只是添加了nuget包,并确保它在我的项目中被正确引用

using ClosedXML.Excel;

然后,我可以使用以下命令访问excel文件

var wb = new XLWorkbook(MyExcelFile);
sycxhyv7

sycxhyv73#

我也有同样的问题。我在掘金中搜索“ClosedXML.Signed”,更新“DocumentFormat.OpenXml”,它就能工作了!

sigwle7e

sigwle7e4#

这对我很有效:
https://social.msdn.microsoft.com/Forums/en-US/e6cc73f3-050c-4a0a-b9e5-42bf904a163f/nuget-package-manager-does-not-copy-depenencies-to-output?forum=csharpgeneral
在此复制以供后人参考:
这里有一个未决问题
https://github.com/NuGet/Home/issues/4837
尝试卸载项目,右键单击项目,编辑。

<PropertyGroup>
     <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

保存,重新加载,构建。

jxct1oxe

jxct1oxe5#

我检查了这里的每一个答案,但没有任何效果。我解决这个问题的方法是通过NuGet包管理器将ClosedXML回滚到v0.90.0。然后,我的错误消息变为抱怨需要DocumentFormat.OpenXML依赖项的v2.16.0。因此,再次通过Nuget包管理器,我把我安装的DocumentFormat.OpenXML的版本改成了v2.16.0。然后它就可以工作了。要让一个简单的DLL工作,要经历多么可怕的废话啊。哦,我还知道一个事实,几个月前它工作得很好,几个月后当我在项目中使用这个功能时,我才发现有些东西发生了变化。

uttx8gqw

uttx8gqw6#

如果您正在从类B引用ClosedXML,而类B被另一个应用程序A调用,则原因应该是:
当A运行时,它只在一组文件夹中查找程序集,它不知道B的依赖项在哪里。如果ClosedXML与A的可执行文件不在同一目录中,那么您可能会遇到此问题。
原始答案见此链接:How to add folder to assembly search path at runtime in .NET?

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(LoadFromSameFolder);

static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{
    string folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");
    if (!File.Exists(assemblyPath)) return null;
    Assembly assembly = Assembly.LoadFrom(assemblyPath);
    return assembly;
}

相关问题