带参数的 Office Interop 构造函数

Office Interop constructor with arguments

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

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 的元数据视图中的定义看起来相同,并且都从以下位置加载互操作文件:

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

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

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

我如何找到 Visual Studio 2015 的等效调用以使其正常工作?

根据评论中的@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一定修复了这个bug,不再像以前那样忽略构造函数参数了。