保存时 C# Word Interop AccessViolationException

标签 c# ms-word office-interop

我想编写一个程序来读取一大堆 word 97 文件 (.doc) 并将它们保存为 .docx 文件。我仅限于 .Net 2.0。

在这个阶段,我只想让它与我的 stub 代码一起工作 - 然后我将编写 GUI 和逻辑以在多个位置打开多个文件,等等...

这是我目前所拥有的:

using MSWord   = Microsoft.Office.Interop.Word;
using MSPPoint = Microsoft.Office.Interop.PowerPoint;

然后

OpenFileDialog ofd = new OpenFileDialog()
{
  CheckFileExists = true,
};

if (ofd.ShowDialog() != DialogResult.OK)
  return;

MSWord.Application app = new MSWord.Application();
MSWord.Document    doc = new MSWord.Document();

doc = app.Documents.Open(ofd.FileName);

try
{
  doc.SaveAs2(ofd.FileName + ".docx", MSWord.WdSaveFormat.wdFormatDocument);
}
catch (Exception ex)
{
  MessageBox.Show("Could not save because:\r\n" + ex.Message,
    ex.GetType().ToString());
}

doc.Close();
app.Quit();

return;

据我所知,正在打开 word 文档。 但是,SaveAs2() 命令似乎会抛出一个 AccessViolationException 并且不会保存 .docx。

谁能告诉我上面的代码有什么问题,为什么不保存,以及如何解决?

谢谢

最佳答案

您陷入了 DLL hell 。只有在计算机上安装了 Office 2010 时才使用 SaveAs2()。任何以前的版本确实会用 AccessViolation 轰炸,该方法未实现。使用正确的 PIA 版本也可以大大避免此问题,请务必使用您愿意支持的最低版本。

使用 SaveAs() 方法。

关于保存时 C# Word Interop AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533302/

相关文章:

c# - 使用 Get 将 ASP.Net MVC 中的 ViewModel 从一个 View 传递到另一个 View

c# - 如何解决错误 : failed due to the following error: 80040154 Class not registered

c# - 从 STA 线程调用 COM 对象导致某些机器上出现 TYPE_E_LIBNOTREGISTERED

c# - 如何在 PowerShell 中创建一个 Outlook 规则,将电子邮件无错误地移动到文件夹,使用在 C# 中完美运行的相同代码?

c# - 如何在 Python 中打印 C#.Net 回调函数

c# - 如何确定下拉列表是否折叠?

java - 使用 Apache POI 将 Excel/Word 转换为 PDF

excel - 如何从Word文件中提取标题到Excel?

c# - 在 Outlook 中处理大量邮件

c# - 依赖于字符串值的业务逻辑