Несколько вопросов работе с AutoCAD через COM

Автор Тема: Несколько вопросов работе с AutoCAD через COM  (Прочитано 21954 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
не ругается и вряд ли должен...
точно забыл - он же в случае не удачи преобразования как раз и должен null вернуть...
и судя по ссылке там все-же должна возникать ошибка создания - то есть скорее все же неверная библиотека, хотя это никак не исключает "плохого" варианта (тем паче, что как я уже говорил ошибка та с "характером").
з.ы. опс - уже ответили - Александр приятного аппетита (про попкорн) :).
з.з.ы. - видимо если в процессе редактирования сообщения добавляется еще несколько в бд Insert вместо Update вылазит.
« Последнее редактирование: 12-03-2014, 22:57:40 от Дима_ »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если запускать (или получать доступ) AutoCAD той версии, которая соответствует подключенным библиотекам, то получаю не null, как и нужно. Соответственно, чтобы вообще избавиться от зависимости к версии AutoCAD, придётся использовать механизм позднего связывания (в этом случае никаких библиотек AutoCAD подключать не нужно):

Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Microsoft.Win32;
  5.  
  6. namespace ConsoleTest {
  7.         class Program {
  8.                 static void Main(string[] args) {
  9.                         String fullName = String.Empty;
  10.                         try {
  11.                                 // Используя эти идентификаторы можно указывать, объект
  12.                                 // приложения какой именно версии следует создать (см. метод
  13.                                 // CreateInstance)
  14.                                 String[] appIds = Registry.LocalMachine.OpenSubKey(
  15.                                         @"SOFTWARE\Classes", false).GetSubKeyNames().Where(n =>
  16.                                                 n.StartsWith("AutoCAD.Application")).ToArray();
  17.  
  18.                                 if (appIds.Length == 0) {
  19.                                         Console.WriteLine("Идентификаторы AutoCAD не обнаружены " +
  20.                                                 "в реестре.");
  21.                                         return;
  22.                                 }
  23.                                 Console.WriteLine("Обнаружены следующие идентификаторы AutoCAD:");
  24.                                 foreach (String item in appIds) Console.WriteLine(item);
  25.  
  26.                                 String strId = appIds[0];
  27.  
  28.                                 // Тип интересующего меня COM объекта
  29.                                 System.Type type = System.Type.GetTypeFromProgID(strId);                               
  30.  
  31.                                 // Вариант с использованием механизма позднего связывания.
  32.                                 // В этом случае не требуется подключать ссылки к библиотекам AutoCAD:
  33.                                 Object app = System.Activator.CreateInstance(type); // AcadApplication
  34.                                 fullName = type.InvokeMember("FullName", System.Reflection.BindingFlags
  35.                                         .GetProperty, null, app, new Object[] { }) as String;
  36.  
  37.                                 Boolean visible = true;
  38.                                 type.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty,
  39.                                         null, app, new Object[] { visible });
  40.  
  41.                                 Object activeDoc = type.InvokeMember("ActiveDocument",
  42.                                         System.Reflection.BindingFlags.GetProperty, null, app,
  43.                                         new Object[] { }); // AcadDocument
  44.  
  45.                                 String command = String.Format("(princ \"Hello, {0}\")(princ)\n",
  46.                                                 Environment.UserName);
  47.                                 type.InvokeMember("SendCommand", System.Reflection.BindingFlags.InvokeMethod,
  48.                                         null, activeDoc, new Object[] { command });
  49.                         }
  50.                         catch (Exception ex) {
  51.                                 Console.WriteLine("Ошибка: {0}", ex.Message);
  52.                         }
  53.                         Console.WriteLine("FullName: {0}", fullName);
  54.                         Console.WriteLine("Нажмите любую клавишу для выхода...");
  55.                         Console.ReadKey();
  56.                 }
  57.         }
  58. }

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
тогда уж используй динамический вызов (я правда не помню в каком c# он появился)
з.ы. у меня в свое время так и не получилось создать vla методами Region через позднее связывание - в итоге забил просто.