2011-04-03 52 views
5

当我想编写一个程序,这将在一大堆字97个文件(.DOC)的读取,并将其保存为.DOCX文件。我仅限于.Net 2.0。C#字的Interop AccessViolationException节省

在这个阶段,我只想把它与我的存根代码的工作 - 然后我会写的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未保存。

可有人请让我知道什么是错的,上面的代码,为什么它不节能,以及如何解决它?

谢谢

+0

如何发布确切的异常(与细节)? – steinar 2011-04-03 23:47:26

回答

10

你被困在DLL地狱。只有在计算机上安装了Office 2010时才使用SaveAs2()。任何之前的版本确实会用AccessViolation炸弹,该方法没有实现。使用适当的PIA版本也会有很长的路要走,以避免这个问题,一定要使用你愿意支持的最低版本。

使用SaveAs()方法。

+0

感谢汉斯。 'SaveAs()'在互操作库的版本14中不可用,但在版本12中可用。奇怪的是,它在PowerPoint互操作的版本14中可用。我已经按照你的建议用'SaveAs()'修复了它,并且它效果很好。 :) – Ozzah 2011-04-04 02:41:54