从.NET 3.5升级到4.5.1时出现“无法加载文件或程序集'Interop.Microsoft.Office.Core,Version = 2.4.0.0 ...'”错误。

4

我正在将我的WinForms应用程序从.NET 3.5升级到4.5.1。

3.5版本的应用程序运行良好。升级到.NET 4.5.1之后,我开始遇到以下异常:

System.IO.FileNotFoundException: 无法加载文件或程序集“Interop.Microsoft.Office.Core, Version=2.4.0.0, Culture=neutral, PublicKeyToken=null”或其某个依赖项。系统找不到指定的文件。

文件名:“Interop.Microsoft.Office.Core, Version=2.4.0.0, Culture=neutral, PublicKeyToken=null”

FusionLog显示:

=== Pre-bind state information ===
LOG: DisplayName = Interop.Microsoft.Office.Core, Version=2.4.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/SampleApp/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : Interop.Microsoft.Office.Interop.Excel, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\SampleApp\bin\Debug\SampleApp.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/SampleApp/bin/Debug/Interop.Microsoft.Office.Core.DLL.
LOG: Attempting download of new URL file:///C:/SampleApp/bin/Debug/Interop.Microsoft.Office.Core/Interop.Microsoft.Office.Core.DLL.
LOG: Attempting download of new URL file:///C:/SampleApp/bin/Debug/Interop.Microsoft.Office.Core.EXE.
LOG: Attempting download of new URL file:///C:/SampleApp/bin/Debug/Interop.Microsoft.Office.Core/Interop.Microsoft.Office.Core.EXE.

奇怪的是我的引用看起来都一样,除了一个引用:在.NET 3.5项目中有一个引用到类型为COM,版本为1.6.0.0的Microsoft.Office.Interop.Excel(它来自GAC),但我无法在.NET 4.5.1项目中重新创建此引用,因为在COM对象引用中没有这样的东西,而且我在.NET引用中找不到这个版本。不知道这是否会导致问题。您有任何想法如何让它在.NET 4.5.1上工作吗?

@Mike:我尝试重新添加了对“Microsoft Office 12.0 Object Library”(COM,版本:2.4.0.0)的引用,但是我找不到另一个引用。不用说,这并没有帮助。似乎在运行时找不到它。编译很好。 - Denis
它是哪个版本的Office? - Mike Cheel
请确认一下,您选择了客户端配置文件还是框架4? - Mike Cheel
这是一个简单的“文件未找到”错误消息,除了指向Microsoft下载站点,我怀疑我们无法为您找到它。称其为幸运的巧合,您需要停止依赖这些PIA。它们在过去的5年中已经过时。有关详细信息,请查看此帖子。 - Hans Passant
@Hans:但是这个文件从哪里来?为什么在3.5下不是问题,在4.5.1下就是问题呢?我认为如果这是PIA的问题,而且只需要简单下载(我已经尝试过),那么它在.NET 3.5下也不会工作。这里发生了其他事情。 - Denis
显示剩余3条评论
2个回答

8
无论您运行的是哪个 .Net 框架版本,都没有关系。看起来您需要重新添加引用。请查看 Visual Studio 的“添加引用”对话框中的 COM 选项卡。互操作程序集将自动生成给您。

特别注意刚刚添加的引用的“嵌入互操作类型”属性:

enter image description here

无论如何,无法加载文件或程序集Microsoft.Office.Interop.Excel这个论坛帖子描述了完全相同的错误。

我不认为这是真的,因为为什么将.NET Framework从3.5更改为.NET 4.5.1会导致问题发生,然后将.NET Framework更改回3.5就可以解决问题。(不触及任何其他内容,只需更改“应用程序->目标框架”下拉菜单)。 - Denis
也许在.NET 4.0或更高版本中,COM对象会被处理得与以往不同?也许有些对象会变得不兼容? - Denis
有可能需要检查一些属性,以便在我的bin/Debug目录中生成/创建程序集吗?错误信息是正确的,它正在寻找的文件:“Interop.Microsoft.Office.Core.dll”不在该目录中。需要做什么才能让这个文件出现? - Denis
请查看PIAs的嵌入互操作类型属性。 - Eugene Astafiev

3
我将"复制本地"和"嵌入互操作类型"设置为true,解决了问题。(我安装了Office 2013和365) enter image description here

2
我使用的是Office 2019。仅仅嵌入互操作类型还不够,同时必须将复制本地设置为“是”。 - BiLaL
我在使用另一个库时遇到了类似的问题,但是打开嵌入互操作类型会出现错误:“无法嵌入互操作类型。请改用适用的接口。” - beleester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接