2016-07-26 209 views
2

我正在編譯別人的項目。他們寫的代碼看起來像這樣:帶參數的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 

在這種情況下,文件是一種接口:

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

而伴生類看起來是這樣的:

[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\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Word.dll 

在兩種情況下確實的DocumentClass包含非默認的構造函數,但它編譯在Visual Studio 2010中。

它爲什麼在2010年編譯?鑑於它在2010年編譯完成,爲什麼它在2015年不再編譯?

我如何才能發現Visual Studio 2015的等效調用使其工作?

+0

+1。我有興趣聽到答案。你確定它使用完全相同的互操作程序集嗎? –

+0

是的,他們都使用GAC的15.0.0.0__71e9bce111e9429c。 –

+0

我在VS 2010中聲明。奇怪的是...... –

回答

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必須修復這個bug,並且它不再像以前那樣忽略構造函數參數。