2016-07-26 17 views
2

Ich versuche, das Projekt eines anderen zu kompilieren. Sie schrieben Code, der wie folgt aussieht:Office Interop-Konstruktor mit Argumenten

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

ich es gut in Visual Studio 2010 kompilieren (wo es entwickelt wurde), aber wenn ich das gleiche Projekt in Visual Studio 2015 zu kompilieren, gibt es diesen Fehler:

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

In diesem Fall ist das Dokument eine Schnittstelle:

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

Und die CoClass sieht wie folgt aus:

[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; } 

    ... 
} 

Die Definitionen sehen in der Metadaten-Ansicht von beiden Versionen von Visual Studio identisch, und beide werden das Laden der Interop-Datei aus:

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

In keinem Fall hat Document einen Nicht-Standard-Konstruktor enthalten, aber es kompiliert in Visual Studio 2010.

Warum kompiliert es in 2010? Und warum, wenn es 2010 kompiliert wird, warum kompiliert es nicht mehr in 2015?

Und wie kann ich den äquivalenten Aufruf für Visual Studio 2015 finden, damit es funktioniert?

+0

+1 für die Frage. Ich bin interessiert, die Antwort zu hören. Sind Sie sicher, dass es genau die gleiche Interop-Baugruppe verwendet? –

+0

Ja, sie verwenden beide 15.0.0.071e9bce111e9429c vom GAC. –

+0

Ich repro'd in VS 2010. Seltsam ... –

Antwort

2

Basierend auf dem @Roryap-Test in den Kommentaren sieht es so aus, als ob Visual Studio 2010 ungültige Aufrufe an den COM-Interop-Konstruktor zuließ.

ich den Code in Visual Studio 2010 erstellt und verwendet ILSpy, um zu sehen, was es erzeugt:

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

Der Dateipfad nirgends zu sehen ist. Visual Studio 2015 muss den Fehler behoben haben und ignoriert Konstruktorargumente nicht mehr wie früher.