9

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

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

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

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

我为该课程提供了以下代码;它所指的行是这两行

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);
            }
        }
    }
}
4

3 回答 3

21

要解决歧义,请使用:

((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);
于 2012-10-18T02:22:27.307 回答
6

尝试铸造你的docs第一个:

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

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

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

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

相同的分辨率可用于您的歧义wordObject,将其转换为_Application.

于 2012-10-18T02:22:09.287 回答
1

建议的解决方案运行良好,但它给 ReSharper 留下了一个不明确的调用错误,除了在 R# 错误对话框中使用旧的“忽略错误”技巧之外,您无法摆脱该错误,即使编译器对此很满意。

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

((dynamic) Doc).Close();

不理想,但我只是捏着鼻子用它。如果您要多次使用它,您显然可以保存到动态变量中。从技术上讲,您可以对所有内容使用动态(它只是后期绑定的 COM),但是您会失去所有的智能感知,所以我只在它出现的少数方法和事件上使用它。

于 2014-12-29T23:18:44.177 回答