带有参数的Office Interop构造函数

时间:2016-07-26 16:38:10

标签: c# com office-interop

我正在尝试编译其他人的项目。他们编写的代码如下:

var doc = new Microsoft.Office.Interop.Word.Document(pathToFile);

我可以在Visual Studio 2010(开发它)中编译它,但是当我在Visual Studio 2015中编译相同的项目时,它会出现此错误:

'Document' does not contain a constructor that takes 1 arguments

在这种情况下,Document是一个界面:

[Guid("0002096B-0000-0000-C000-000000000046")]
[CoClass(typeof(DocumentClass))]
public interface Document : _Document, DocumentEvents2_Event { }

CoClass看起来像这样:

[ComSourceInterfaces("Microsoft.Office.Interop.Word.DocumentEvents2")]
[Guid("00020906-0000-0000-C000-000000000046")]
[TypeLibType(2), ClassInterface(0)]
public class DocumentClass : _Document, Document, DocumentEvents2_Event, DocumentEvents_Event
{
    public DocumentClass();
    [DispId(-2147418112)] public virtual string _CodeName { get; set; }

    ...
}

两个版本的Visual Studio的元数据视图中的定义相同,并且都从以下位置加载interop文件:

C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Word.dll

在两种情况下,DocumentClass都不包含非默认构造函数,但它在Visual Studio 2010中编译。

为什么要在2010年编译?鉴于它在2010年编译,为什么它不再在2015年编译?

我怎样才能发现Visual Studio 2015的等效调用以使其有效?

1 个答案:

答案 0 :(得分:2)

基于评论中的@roryap测试,看起来Visual Studio 2010允许对COM互操作构造函数进行无效调用。

我在Visual Studio 2010中编译了代码,并使用ILSpy查看它生成的内容:

doc = (Microsoft.Office.Interop.Word.Document)Activator.CreateInstance(
    Type.GetTypeFromCLSID(
        new Guid("00020906-0000-0000-C000-000000000046")));

文件路径无处可见。 Visual Studio 2015必须修复错误,它不再像以前那样忽略构造函数参数。