【问题标题】:Ambiguity in Word Interop code [duplicate]Word 互操作代码中的歧义[重复]
【发布时间】:2015-03-01 08:21:10
【问题描述】:

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

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

警告方法之间的歧义 'Microsoft.Office.Interop.Word._Document.Close(参考对象,参考对象,参考对象)' 和非方法“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);
            }
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    要解决歧义,请使用:

    ((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);
    

    【讨论】:

      【解决方案2】:

      先尝试投射你的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

      【讨论】:

        【解决方案3】:

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

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

        ((dynamic) Doc).Close();
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          相关资源
          最近更新 更多