Подключение к Компасу из под приложения (*.EXE) написанного на C#

Автор Sprinter500, 18.08.19, 19:31:35

« предыдущая - следующая »

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

Sprinter500

Добрый день!
В SDK Компаса использована идеология написания библиотек. Мы же привыкли при необходимости писать внешние приложения EXE, в коде которых подключение к Компасу происходит несколько иначе, чем в библиотеках. Все было хорошо пока пользовались VB6 и Delphi. Но вот теперь переходим на C# и давно, забытые проблемы с подключением к Компасу вернулись. Это самый первый шаг. В общем необходимо подключиться и через API5 и через API7. Пример с кодом:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Kompas6API5;
using KAPITypes;
using Kompas6Constants;
using KompasAPI7;

namespace Shablon
{
    public partial class Form1 : Form
    {
        private KompasObject kompas;
        private ksDocument2D doc;
        private IApplication KompasApp;
        private IKompasDocument kompasDocument;
        private IKompasDocument2D kompasDocument2D;
        private IKompasDocument2D1 kompasDocument2D1;
        private IApplication iApi7;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            // .... kompas = .... ;
            //ksDocument2D doc = (ksDocument2D)kompas.Document2D();
            //ksDocument2D doc = (ksDocument2D)kompas.ActiveDocument2D();

           

        }

        private void button1_Click(object sender, EventArgs e)
        {
            doc.ksLineSeg(20, 10, 40, 10, 1);
        }
    }
}

Vi2

Можно просто подключить имена VB  (Microsoft.VisualBasic.Interaction) и пользоваться их функциями - это же одна среда.
Но есть и аналоги.
GetObject(,"KOMPAS.Application.5") == (KompasObject)Marshal.GetActiveObject("KOMPAS.Application.5");
CreateObject("KOMPAS.Application.5") == (KompasObject)Activator.CreateInstance(Type.GetTypeFromProgID("KOMPAS.Application.5"));

once

KompasObject _kompas = GetKompas();
IApplication _kompasApi7 = (IApplication) _kompas.ksGetApplication7();


//зкапускает Компас
public KompasObject CreateKompas()
        {
            KompasObject kompas = (KompasObject)CreateApplicationObject("KOMPAS.Application.5");
            if (kompas != null) return kompas;
            throw new SystemException("Проблема запуска Kompas, возможно приложение не установлено!");
        }

//Получает экземпляр запущенного компаса
public KompasObject GetKompas()
        {
            KompasObject kompas = (KompasObject)GetApplicationObject("KOMPAS.Application.5");
            if (kompas != null) return kompas;
            throw new SystemException("Проблема подключения к Kompas!");
        }

private static object CreateApplicationObject(string progId)
        {
            try
            {
                object obj = Activator.CreateInstance(Type.GetTypeFromProgID(progId) /*Type.GetTypeFromCLSID(new Guid("FBE002A6-1E06-4703-AEC5-9AD8A10FA1FA"))*/);
                return obj;
            }
            catch
            {
                return null;
            }
        }

private static object GetApplicationObject(string progId)
        {
            try
            {
                object obj = null;
                try
                {
                    obj = Marshal.GetActiveObject(progId);
                    return obj;
                }
                catch
                {
                    obj = Activator.CreateInstance(Type.GetTypeFromProgID(progId)/*Type.GetTypeFromCLSID(new Guid("FBE002A6-1E06-4703-AEC5-9AD8A10FA1FA"))*/);
                    return obj;
                }
            }
            catch
            {
                return null;
            }
        }

Sprinter500

Большое спасибо, всем ответившим! Буду пробовать.