19

私のアプリケーションには次のC#コードがあり、問題なく動作します。Excelの新しいインスタンスを起動します。

private readonly Microsoft.Office.Interop.Excel.Application _application;
_application = new Microsoft.Office.Interop.Excel.Application();
_application.Visible = true;

私は最近、アプリケーションがインターフェースタイプであることに気づきました。正確には何が起こっているのですか、そしてそれはどのように可能ですか?

4

2 に答える 2

32

CoClassコンパイラーを使用すると、インターフェースを実装する具象クラス(ComImportおよびaと)を識別する属性でインターフェースが装飾されている場合に、インターフェースをインスタンス化できますGuid。インターフェイスをインスタンス化すると、実際にはこの具体的なクラスが舞台裏でインスタンス化されます。

この「機能」は、COMインポートタイプの配管として使用することを目的としています。OutlookApplicationインターフェイスが次の名前の具象クラスによってどのようにサポートされているかに注目してApplicationClassください。

[GuidAttribute("00063001-0000-0000-C000-000000000046")]
[CoClassAttribute(typeof(ApplicationClass))]
public interface Application : _Application, ApplicationEvents_11_Event

ほとんどの場合、これらの属性を独自のインターフェイスに適用しないでください。ただし、デモンストレーションのために、コンパイラーこの可能性を利用してコード内のインターフェースをインスタンス化できることを示すことができます。次の簡単な例を考えてみましょう(GUIDはランダムです)。

[ComImport]
[Guid("175EB158-B655-11E1-B477-02566188709B")]
[CoClass(typeof(Foo))]
interface IFoo
{
    string Bar();
}

class Foo : IFoo
{
    public string Bar()
    {
        return "Hello world"; 
    }
}

上記の宣言を使用して、独自のIFooインターフェースのインスタンスを作成できます。

IFoo a = new IFoo();
Console.WriteLine(a.Bar());
// Output: "Hello world"

編集jonnyGoldは、ExcelApplicationインスタンスがMSDNで装飾されていないことを正しく認識していますがCoClass、これはMSDNの省略のようです。Microsoft.Office.Interop.Excelアセンブリから逆コンパイルされた署名は次のとおりです。

[CoClass(typeof(ApplicationClass)), Guid("000208D5-0000-0000-C000-000000000046")]
[ComImport]
public interface Application : _Application, AppEvents_Event
于 2012-06-14T19:17:54.543 に答える
-2

MSDNがそう言っているので:

たとえば、次のコードはExcelMicrosoft.Office.Interop.Excel.Applicationインターフェイスを使用しています。実行時に、Applicationクラスを使用してExcel Applicationオブジェクトをインスタンス化し、ワークシートを開きます。

于 2012-06-14T18:55:11.717 に答える