Вопрос
Мой вопрос: Поддерживает ли С# поддержку позднего связывания IDispatch?
Притвориться, что я пытаюсь автоматизировать Office, будучи совместимым с любой версией, установленной клиентом.
В мире .NET, если вы создали с установленным Office 2000, каждый разработчик и каждый клиент, отныне до конца срока, должен иметь Office 2000.
В мире перед .NET мы использовали COM для общения с приложениями Office.
Например:
1) Используйте независимую версию версии ProgID
"Excel.Application"
который разрешает:
clsid = {00024500-0000-0000-C000-000000000046}
а затем используя COM, мы просим, чтобы один из этих классов был создан в объект:
IUnknown unk;
CoCreateInstance(
clsid,
null,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IUnknown,
out unk);
И теперь мы уходим на гонки - умеем использовать Excel из моего приложения. Конечно, если вы действительно хотите использовать объект, вы должны вызвать способ вызова методов.
Мы могли бы получить различные объявления интерфейса, переведенные на наш язык. Этот метод хорош, потому что мы получаем
- раннее связывание
- code-insight
- проверка синтаксиса типа компиляции
а пример кода может быть:
Application xl = (IExcelApplication)unk;
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
Worksheet worksheet = workbook.ActiveSheet;
Но есть недостатки в использовании интерфейсов: нам нужно получить различные декларации интерфейса, переданные на наш язык. И мы застряли, используя вызовы на основе методов, указав все параметры, например:
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
xl.Worksheets.Add(before, after, count, type, lcid);
Это доказало, что в реальном мире есть такие недостатки, которые мы бы с готовностью отказались:
- раннее связывание
- код-прозрение
- проверка синтаксиса времени компиляции
и вместо этого используйте IDispatch позднюю привязку:
Variant xl = (IDispatch)unk;
Variant newWorksheet = xl.Worksheets.Add();
Поскольку автоматизация Excel была разработана для VB Script, многие параметры могут быть опущены, даже если нет перегрузки без них.
Примечание. Не путайте мой пример Excel по причине того, почему я хочу использовать IDispatch. Не каждый COM-объект является Excel. Некоторые COM-объекты не имеют поддержки, кроме как через IDispatch.