C # System .__ ComObject возвращается при доступе к файлу Excel - PullRequest
3 голосов
/ 21 ноября 2011

Я пытаюсь получить доступ к файлу 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);

В последней строке содержимое книжной переменной равно System.__ComObject, в то время как в другом приложении работает код и переменная имеет ...Excel.WorkbookClass.

Итак, я хотел бы спросить, в чем может быть причина этого странного поведения.Я уже пытался вызвать Workbooks.Open с дополнительными аргументами Missing.Value, но результат был тот же.

1 Ответ

2 голосов
/ 21 ноября 2011

.NET COM-реализация использует прокси-объекты, эти прокси-серверы создаются внутренне и наследуются от System .__ ComObject, так что это нормальное поведение.Это своего рода «динамические объекты».Вы можете привести __ComObject к интерфейсу или классу, который вам нужен.Вы можете без проблем привести его к WorkbookClass.

Все зависит от того, как вы получите экземпляр ... если вы создадите объект с новым, например, new WorkbookClass, C # непосредственно создаст строго типизированный объект,Вместо этого, если объект возвращается из функции COM или свойства, он часто возвращает __ComObject, потому что __ComObject может быть почти всем и может быть приведен к нескольким интерфейсам, конечно, C # не знает, что возвращать, поэтому он возвращает это специальноевид "динамического" объекта.Эти объекты называются RCW, что означает Runtime Callable Wrapper.

Хорошее чтение может быть http://www.codeproject.com/KB/cs/cominteropnet.aspx

...