| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Аналог IDispatch в .NET

Аналог IDispatch в .NET

Ответ
Поиск в этой теме
Непрочитано 22.12.2011, 14:02 #1
Аналог IDispatch в .NET
Nordek
 
Регистрация: 11.09.2008
Сообщений: 386

Добрый день, подскажите пожалуйста аналог IDispatch в .NET, нужен для работы с элементами чертежа Автокад.
Просмотров: 2260
 
Непрочитано 22.12.2011, 15:23
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Ты имеешь в виду это?
Код:
[Выделить все]
 Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.Globalization
Imports System.Collections

Public Class ReflectionCommands

    <System.Security.SuppressUnmanagedCodeSecurity()> _
    Public Shared Sub TestACAD()
        'Save curent culture to variable
        Dim thisThread As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
        'Set culture on whatever you want
        thisThread = New System.Globalization.CultureInfo("en-US")
        Dim appProgID As String = "Autocad.Application"
        Dim filename As String = "C:\Test\MyDoc.dwg"
        ' Get reference on interface IDispatch
        Dim AcadType As Type = Type.GetTypeFromProgID(appProgID)

        ' Launch Acad
        Dim AcadApp As Object = Activator.CreateInstance(AcadType)
        Dim visargs() As Object = New Object(0) {}
        visargs(0) = True
        ' Set application window visible
        AcadApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, Nothing, AcadApp, visargs, Nothing)
        Dim AcadDocs As Object = AcadApp.GetType().InvokeMember( _
    "Documents", BindingFlags.GetProperty, Nothing, AcadApp, Nothing)

        ' Create array of parameters
        Dim args() As Object = New Object(1) {}
        args(0) = filename
        args(1) = False 'read-only=false
        ' Trying open file
        Dim AcDoc As Object = AcadDocs.GetType.InvokeMember( _
        "Open", BindingFlags.InvokeMethod, Nothing, AcadDocs, args, Nothing)
        Dim Util As Object = New Object
        Try
            ' Get reference on active document
            AcDoc = AcadApp.GetType.InvokeMember( _
        "ActiveDocument", BindingFlags.GetProperty, Nothing, AcadApp, Nothing, Nothing)
            ' Get reference of  AcadUtility
            Util = AcDoc.GetType().InvokeMember("Utility", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)
            ' Get reference on ModelSpace
            Dim oSpace As Object = _
            AcDoc.GetType.InvokeMember( _
            "ModelSpace", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)
            ''************************************** draw circle **************************
            Dim cp(0 To 2) As Double
            For i = 0 To 2
                cp(i) = 0.0
            Next

            Dim circ As Object = DrawCircle(oSpace, cp, 0.5)
            ''****************************************************************************
            AcadApp.GetType().InvokeMember( _
            "Regen", BindingFlags.InvokeMethod, Nothing, AcadApp, Nothing)
            'Save document
            Dim closeargs() As Object = New Object(1) {}
            closeargs(0) = False
            ' with the same name
            closeargs(1) = filename
            ' Try close document

            ' Simplified syntax
            AcDoc.GetType().InvokeMember( _
                    "Close", BindingFlags.InvokeMethod, Nothing, AcDoc, closeargs)

            ' Try close Acad application
            AcadApp.GetType().InvokeMember( _
            "Quit", BindingFlags.InvokeMethod, Nothing, AcadApp, Nothing)
            MsgBox("Finished")

        Catch ex As System.Exception
            MsgBox("Reason: " & ex.Message & vbLf & "Trace: " & ex.StackTrace)
        Finally

            'stop process and clean memory
            ' Kill AcDoc.
            releaseObject(AcDoc)
            ' Kill AcadDocs.
            releaseObject(AcadDocs)
            ' Kill AcadApp.
            releaseObject(AcadApp)
            ' Call garbage cleaner to clean memory immediately after
            GC.WaitForPendingFinalizers()
            GC.GetTotalMemory(True)
            GC.WaitForPendingFinalizers()
            GC.GetTotalMemory(True)

            ' Set current culture back
            System.Threading.Thread.CurrentThread.CurrentUICulture = thisThread

        End Try

    End Sub

    Public Shared Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub

    ' sample aux
    Public Shared Function DrawCircle(ByVal oBlock As Object, ByVal p() As Double, ByVal rad As Double) As Object

        Dim args() As Object = New Object(1) {}
        args(0) = p
        args(1) = rad
        Dim oCirc As Object = oBlock.GetType.InvokeMember("AddCircle", BindingFlags.InvokeMethod, Nothing, oBlock, args)
        Dim norm() As Double = New Double() {0.0, 0.0, 1.0}
        oCirc.GetType().InvokeMember("Normal", BindingFlags.SetProperty, Nothing, oCirc, New Object() {norm})

        Return oCirc
    End Function
    Public Shared Function DrawLine(ByVal oBlock As Object, ByVal p1() As Double, ByVal p2() As Double) As Object

        Dim args() As Object = New Object(1) {}
        args(0) = p1
        args(1) = p2
        Dim oCirc As Object = oBlock.GetType.InvokeMember("AddLine", BindingFlags.InvokeMethod, Nothing, oBlock, args)
        Dim norm() As Double = New Double() {0.0, 0.0, 1.0}
        oCirc.GetType().InvokeMember("Normal", BindingFlags.SetProperty, Nothing, oCirc, New Object() {norm})

        Return oCirc
    End Function

End Class
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 22.12.2011, 15:33
#3
Nordek


 
Регистрация: 11.09.2008
Сообщений: 386


...не думаю, что моя голова способна думать такое...
Не, я просто один Делфи проект работающий с Автокадом попытался откомпиллить в Делфи.НЕТ и получил кучу сообщений об ошибке в т.ч. и про Idispatch.
Nordek вне форума  
 
Непрочитано 22.12.2011, 15:49
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813



Я думаю с Delphi тебе только ShaggyDog сможет помочь напиши ему в личку
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 22.12.2011, 17:04
#5
Nordek


 
Регистрация: 11.09.2008
Сообщений: 386


Спасибо за "наводку"...
Nordek вне форума  
 
Непрочитано 22.12.2011, 18:07
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Не за что
Успехов
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Аналог IDispatch в .NET

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# .NET AC2012 Аналог команды Очистить(PURGE) xsakabsx .NET 2 07.09.2011 18:24
Аналог lisp команды command в .net xsakabsx LISP 3 18.11.2010 23:31
Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок. Pastor LISP 16 17.11.2010 13:15
Существует ли аналог (findfile) в .NET? Кулик Алексей aka kpblc .NET 16 13.08.2010 00:11
.Net событие double-click как поймать dvim .NET 7 04.04.2010 15:13