3

以下のコードでExcelファイルにアクセスしようとしています:

Microsoft.Office.Interop.Excel.Application ObjExcel
  = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook book;
Microsoft.Office.Interop.Excel.Worksheet sheet;
Excel.Range range1 = null, range2 = null;
CultureInfo ci = new CultureInfo("en-US");
Thread thisThread = Thread.CurrentThread;
thisThread.CurrentCulture = new CultureInfo("en-US");
book = ObjExcel.Workbooks.Open(LinguisticInstructionsFileName);

book 変数の最後の行の内容はSystem.__ComObjectwhile in different app code is working で、 variable has...Excel.WorkbookClassです。

では、この奇妙な振る舞いの理由は何なのか、お聞きしたいと思います。追加の Missing.Value 引数を使用して Workbooks.Open を呼び出そうとしましたが、結果は同じでした。

4

1 に答える 1

2

.NET COM 実装はプロキシ オブジェクトを使用します。これらのプロキシは内部で生成され、System.__ComObject から派生するため、これは通常の動作です。それらは一種の「動的オブジェクト」です。__ComObject を必要なインターフェイスまたはクラスにキャストできます。問題なく WorkbookClass にキャストできます。

それはすべて、インスタンスの取得方法に依存します...たとえば、 new を使用してオブジェクトを作成するとnew WorkbookClass、C# は厳密に型指定されたオブジェクトを直接作成します。代わりに、オブジェクトが COM 関数またはプロパティから返される場合、__ComObject を返すことがよくあります。これは、__ComObject がほとんどすべてであり、いくつかのインターフェイスにキャストできるためです。もちろん、C# は何を返すかがわからないため、この特別な値を返します。一種の「動的」オブジェクト。これらのオブジェクトは、Runtime Callable Wrapper を表す RCW と呼ばれます。

http://www.codeproject.com/KB/cs/cominteropnet.aspxをよく読んでください。

于 2011-11-21T12:33:06.120 に答える