Вопрос
Мой вопрос: Поддерживает ли C # нативную позднюю привязку 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 из моего приложения. Конечно, если действительно вы хотите использовать объект, вы должны вызвать метод вызова методов.
Мы можем получить различные объявления интерфейса , переведенные на наш язык. Эта техника хороша, потому что мы получаем
- раннее связывание
- код-понимание
- проверка синтаксиса типа компиляции
и пример кода может быть:
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.