Word Interop代码中的歧义

时间:2012-10-18 02:08:52

标签: c# ms-word vsto compiler-warnings

我最近发布了一个关于阅读Word文件here的问题。

该应用程序运行正常,但我收到此警告消息;

  

警告方法之间存在歧义        'Microsoft.Office.Interop.Word._Document.Close(ref object,ref object,ref object)'        和非方法'Microsoft.Office.Interop.Word.DocumentEvents2_Event.Close'。运用        方法组。

某些使用命名空间似乎有些含糊不清,我想知道如何解决这个问题。虽然应用程序运行,但我希望尽量减少警告/错误。

我在课程中提供了以下代码;它引用的线是这两行

docs.Close(ref nullobject, ref nullobject, ref nullobject);
wordObject.Quit(ref nullobject, ref nullobject, ref nullobject);

整个代码:

namespace Wizard.Classes
{
    class MSWordReader
    {
        public void read(String filename)
        {
            String buffer = "";
            try
            {
                Microsoft.Office.Interop.Word.Application wordObject = new   
                Microsoft.Office.Interop.Word.Application();
                object file = filename; //this is the path
                object nullobject = Type.Missing;
                object visible = false;
                object readonlyp = true;
                object addtorecent = false; //add to words recent filelist

                Microsoft.Office.Interop.Word.Document docs = wordObject.Documents.Open
                    (ref file,ref nullobject, ref readonlyp, ref addtorecent,
                    ref nullobject, ref nullobject, ref nullobject, ref nullobject,
                    ref nullobject, ref nullobject, ref nullobject, ref visible,
                    ref nullobject, ref nullobject, ref nullobject, ref nullobject
                                    );
                docs.ActiveWindow.Selection.WholeStory();
                docs.ActiveWindow.Selection.Copy();
                IDataObject data = Clipboard.GetDataObject();
                buffer = data.GetData(DataFormats.Text).ToString();

                docs.Close(ref nullobject, ref nullobject, ref nullobject);

                wordObject.Quit(ref nullobject, ref nullobject, ref nullobject);
                MessageBox.Show(buffer);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:20)

要解决歧义,请使用:

((Microsoft.Office.Interop.Word._Document)docs).Close(ref nullobject, ref nullobject, ref nullobject);    
((Microsoft.Office.Interop.Word._Application)wordObject).Quit(ref nullobject, ref nullobject, ref nullobject);

答案 1 :(得分:6)

首先尝试投射docs

((_Document)docs).Close(ref nullobject, ref nullobject, ref nullobject);

Microsoft.Office.Interop.Word.Document接口实现DocumentEvents2_Event_Document接口。每个都有一个close方法,编译器无法确定你的意思。

或者,您可以首先将docs变量声明为_Document

Microsoft.Office.Interop.Word._Document docs = wordObject.Documents.Open ...

相同的解决方案可用于wordObject上的歧义,并将其转换为_Application

答案 2 :(得分:1)

建议的解决方案工作正常,但它给ReSharper留下了一个不明确的调用错误,除了在R#错误对话框中使用旧的“忽略错误”技巧之外,即使编译器足够开心也是如此用它。

我无法从R#中获得一个好的解决方案,它只出现在几个地方,所以我发现有效且不会产生Visual Studio或R#错误的最不好的答案是转换为一个动态的。

((dynamic) Doc).Close();

不理想,但我只是捏住鼻子并使用它。如果您打算多次使用它,您显然可以保存为动态变量。你可以在技术上将动态用于所有东西(它只是后期绑定的COM),但是你会丢失所有的智能感知器,所以我只在它出现的几个方法和事件上使用它。