なぜかインタフェースのインスタンス生成が可能(正確にはできていない)

結論:CoClass
です。知ってる人にとってはそれだけの話です。

事の発端は以下のコード(C# .net 一部省略してます)

[CSharp]
using Excel = Microsoft.Office.Interop.Excel;
Excel.Application oXls = new Excel.Application();
[/CSharp]

Microsoft.Office.InteropはC#からExcelを操作するためのCOMです。

Excel.ApplicationはExcel全体を表す物なんですが・・・これインタフェースです。

あれ?インタフェースってインスタンス作れるの?

いやいやそんなまさか・・・そんな馬鹿な・・・

流石の俺でもそんなことくらい分かってますよぉ!

と、思いつつも分からないのでぐぐる。それでも分からないので指導員に聞きました。

俺「C#でインタフェースってインスタンス作れませんよね?」

指導員「作れるよ?」

俺「ええ!?そんなまさか・・・」

指導員「実装クラスを指定するから~云々」

俺「確かにインタフェース型の変数に実装クラスのインスタンス突っ込むなら分かるんですけど」

俺「このコードはインタフェースのインスタンスを生成してますよね」

指導員「あー・・・うーん、分からないなあ」

指導員からも明確な答えが得られませんでした。

所がここで、あることに気付けました。

「ひょっとしてこのインタフェースって何か特殊なんじゃないの。」

早速、Excel.Applicationの中身をチェック!

[CSharp]
using System.Runtime.InteropServices;

namespace Microsoft.Office.Interop.Excel
{
[Guid(“000208D5-0000-0000-C000-000000000046”)]
[CoClass(typeof(ApplicationClass))]
public interface Application : _Application, AppEvents_Event
{
}
}
[/CSharp]

何やら凄くそれっぽい記述がありました。

CoClass(typeof(ApplicationClass))

軽くしか調べていませんが、どうやらCOMはこのCoClassっていうので、実装クラスを指定できるみたいです。

CoClassで調べると全く同じ質問をしている人も見つかりました。

一番上のコード、逆コンパイルするとExcel.Application();がExcel.ApplicationClass();に置き換わるみたいですね。

試してないけど、確かにそれならコンパイル通る。

という訳で今日もまた一つ賢くなりました。