using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Win32;
namespace ConsoleTest {
class Program {
static void Main(string[] args) {
String fullName = String.Empty;
try {
// Используя эти идентификаторы можно указывать, объект
// приложения какой именно версии следует создать (см. метод
// CreateInstance)
String[] appIds = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Classes", false).GetSubKeyNames().Where(n =>
n.StartsWith("AutoCAD.Application")).ToArray();
if (appIds.Length == 0) {
Console.WriteLine("Идентификаторы AutoCAD не обнаружены " +
"в реестре.");
return;
}
Console.WriteLine("Обнаружены следующие идентификаторы AutoCAD:");
foreach (String item in appIds) Console.WriteLine(item);
String strId = appIds[0];
// Тип интересующего меня COM объекта
System.Type type = System.Type.GetTypeFromProgID(strId);
// Вариант с использованием механизма позднего связывания.
// В этом случае не требуется подключать ссылки к библиотекам AutoCAD:
Object app = System.Activator.CreateInstance(type); // AcadApplication
fullName = type.InvokeMember("FullName", System.Reflection.BindingFlags
.GetProperty, null, app, new Object[] { }) as String;
Boolean visible = true;
type.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty,
null, app, new Object[] { visible });
Object activeDoc = type.InvokeMember("ActiveDocument",
System.Reflection.BindingFlags.GetProperty, null, app,
new Object[] { }); // AcadDocument
String command = String.Format("(princ \"Hello, {0}\")(princ)\n",
Environment.UserName);
type.InvokeMember("SendCommand", System.Reflection.BindingFlags.InvokeMethod,
null, activeDoc, new Object[] { command });
}
catch (Exception ex) {
Console.WriteLine("Ошибка: {0}", ex.Message);
}
Console.WriteLine("FullName: {0}", fullName);
Console.WriteLine("Нажмите любую клавишу для выхода...");
Console.ReadKey();
}
}
}