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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Проблема с запуском на Windows 7 из другого .NET приложения (COMException 80080005)

Проблема с запуском на Windows 7 из другого .NET приложения (COMException 80080005)

Ответ
Поиск в этой теме
Непрочитано 19.07.2011, 13:31 #1
Проблема с запуском на Windows 7 из другого .NET приложения (COMException 80080005)
IvanShkuropadsky
 
Регистрация: 19.07.2011
Сообщений: 5

Проблема с запуском на Windows 7 из другого .NET приложения (COMException 80080005).
При попытке запустить AutoCAD из приложения, написанного на C#.NET возникает исключение.

На Windows XP код работает нормально.
На Windows 7 при вызове оператора

AcadApplication acad = new AcadApplication();

или

object acad = Activator.CreateInstance(
Type.GetTypeFromProgID("AutoCAD.Application"));

картина следующая:
- несколько секунд запускается процесс acad.exe
- потом загрузка процесса пропадает, но примерно пару минут приложение "висит"
- потом возникает исключение, его обработка даёт:

{"Сбой при получении производства объектов класса COM для компонента с CLSID {28B7AA99-C0F9-4C47-995E-8A8D729603A1} в результате следующей ошибки: 80080005."}

====================================

Общая теория происходящего (безотносительно AutoCAD) изложена в статье:
http://blogs.msdn.com/b/adioltean/ar...24/432519.aspx

Но почему эта проблема проявляется на Windows 7, и как её устранить (предотвратить) - непонятно.

Интересно, что обойти проблему можно так:

try
{
acad = new AcadApplication();
}
catch (Exception ex)
{
acad = new AcadApplication();
}


Но задержка при первой попытке запуска, вообще говоря, неприемлема...

Буду очень признателен, если кто-нибудь из работающих с AutoCAD через COM на Windows Vista или 7 напишет о своём опыте.
Просмотров: 3969
 
Автор темы   Непрочитано 22.07.2011, 13:45
#2
IvanShkuropadsky


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


Забыл указать версию AutoCAD: 2007.

Чтобы было понятно в каком месте проявляется проблема, привожу пример пробного консольного приложения:

1. вывод на экран на компьютере с Windows 7:
Код:
[Выделить все]
==============================================================================
Stage 1. Begin

TRY: Marshal.GetActiveObject(AutoCAD.Application)
...CATCH exception:
----------------------------------------------------------
Операция недоступна (Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
System.Runtime.InteropServices.COMException (0x800401E3): Операция недоступна (И
сключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
   в System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr
 reserved, Object& ppunk)
   в System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
   в AcadTestByInvoke.Program.TestByInvokeMember() в M:\netshared\VS2008 Project
s\AcadTestConsoleApp\AcadTestByInvoke\Program.cs:строка 42
----------------------------------------------------------

Don't worry - we'll try to create AutoCAD instance by ourselves.
Press any key to continue....

TRY: Activator.CreateInstance( < AutoCAD.Application > )
...CATCH exception:
----------------------------------------------------------
Сбой при получении производства объектов класса COM для компонента с CLSID {28B7
AA99-C0F9-4C47-995E-8A8D729603A1} в результате следующей ошибки: 80080005.
System.Runtime.InteropServices.COMException (0x80080005): Сбой при получении про
изводства объектов класса COM для компонента с CLSID {28B7AA99-C0F9-4C47-995E-8A
8D729603A1} в результате следующей ошибки: 80080005.
   в System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(Runtim
eType objectType)
...
   в System.Activator.CreateInstance(Type type, Boolean nonPublic)
   в System.Activator.CreateInstance(Type type)
   в AcadTestByInvoke.Program.TestByInvokeMember() в M:\netshared\VS2008 Project
s\AcadTestConsoleApp\AcadTestByInvoke\Program.cs:строка 54
----------------------------------------------------------

Failure... Very bad...
Press any key to continue....

SECOND ATTEMPT: Activator.CreateInstance( < AutoCAD.Application > )

AutoCAD.Application new instance has been created.

Everything seems to be OK.
Press any key to continue....
То есть процесс появляется, но через ровно 120 ожидания возникает исключение.
После этого вторая попытка отрабатывается без проблем.

Далее всё - в штатном режиме:
Код:
[Выделить все]
==============================================================================
Stage 2. Main work


TRY: progType.InvokeMember("Visible", BindingFlags.GetProperty, ... )

AutoCAD.Application instance window is NOT visible.
Press any key to continue....

TRY: progType.InvokeMember("Visible", BindingFlags.SetProperty, ... )

AutoCAD.Application instance window should be visible now.
Press any key to continue....

TRY: progType.InvokeMember("Quit", ... )

AutoCAD.Application instance has been closed.
Press any key to continue....


==============================================================================
Stage 3. End

TRY: Marshal.ReleaseComObject( < progObj > )

...quiting...
Press any key to continue....
2. сама программа:
Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices;
using System.Reflection;

namespace AcadTestByInvoke
{
    class Program
    {
        static void Main(string[] args)
        {
            TestByInvokeMember();
            Console.ReadKey();
        }

        /// <summary>
        /// Tests AutoCAD automation through using Type.InvokeMember() method. 
        /// Written by Ivan Shkuropadsky, 2011
        /// email: [email protected]
        /// </summary>
        static void TestByInvokeMember()
        {
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("AcadTestByInvoke()");

            string progAppID = "AutoCAD.Application";
            Type progAppType = Type.GetTypeFromProgID(progAppID);

            object progObj = null;
            Type progObjType = null;
            bool isNewInstanceCreated = false;

            // ==============================================================================
            WriteStageHeader("Stage 1. Begin");
            try
            {
                Console.WriteLine("TRY: Marshal.GetActiveObject({0})", progAppID);
                progObj = Marshal.GetActiveObject(progAppID);
            }
            catch (Exception ex)
            {
                WriteException(ex);
                WaitAnyKeyPressed("Don't worry - we'll try to create AutoCAD instance by ourselves.");

                isNewInstanceCreated = true;
                Console.WriteLine();
                try
                {
                    Console.WriteLine("TRY: Activator.CreateInstance( < {0} > )", progAppID.ToString());
                    progObj = Activator.CreateInstance(progAppType);
                }
                catch (Exception ex2)
                {
                    WriteException(ex2);
                    // workaround (http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_23771996.html)
                    WaitAnyKeyPressed("Failure... Very bad...");

                    Console.WriteLine();
                    try
                    {
                        Console.WriteLine("SECOND ATTEMPT: Activator.CreateInstance( < {0} > )", progAppID.ToString());
                        progObj = Activator.CreateInstance(progAppType);
                    }
                    catch (Exception ex3)
                    {
                        WriteException(ex3);
                        WaitAnyKeyPressed("LOOSER! (AutoCAD isn't installed?)");
                    }
                }
            }

            Console.WriteLine();
            if (progObj == null)
            {
                string msg = string.Format("SORRY, NO SUCCESS in getting or creating {0} instance!", progAppID);
                WaitAnyKeyPressed(msg);
                return;
            }
            else
            {
                progObjType = progObj.GetType();
                if (isNewInstanceCreated)
                {
                    Console.WriteLine("{0} new instance has been created.", progAppID);
                }
                else
                {
                    Console.WriteLine("{0} existing instance has been taken.", progAppID);
                }
                WaitAnyKeyPressed("Everything seems to be OK.");
            }


            // ==============================================================================
            WriteStageHeader("Stage 2. Main work");

            // checking visible
            bool isVisible = false;
            Console.WriteLine();
            try
            {
                Console.WriteLine("TRY: progType.InvokeMember(\"Visible\", BindingFlags.GetProperty, ... )");
                isVisible = (bool)progObjType.InvokeMember("Visible", BindingFlags.GetProperty, null, progObj, null);
            }
            catch (Exception ex)
            {
                WriteException(ex);
            }

            if (isVisible)
            {
                WaitAnyKeyPressed(String.Format("{0} instance window is visible.", progAppID));
            }
            else
            {
                WaitAnyKeyPressed(String.Format("{0} instance window is NOT visible.", progAppID));
            }


            if (!isVisible)
            {
                // making visible
                Console.WriteLine();
                try
                {
                    Console.WriteLine("TRY: progType.InvokeMember(\"Visible\", BindingFlags.SetProperty, ... )");
                    progObjType.InvokeMember("Visible", BindingFlags.SetProperty, null, progObj, new object[] { true });
                }
                catch (Exception ex)
                {
                    WriteException(ex);
                }
                WaitAnyKeyPressed(String.Format("{0} instance window should be visible now.", progAppID));
            }

            // closing 
            Console.WriteLine();
            try
            {
                Console.WriteLine("TRY: progType.InvokeMember(\"Quit\", ... )");
                progObjType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, progObj, new object[] { });
            }
            catch (Exception ex)
            {
                WriteException(ex);
            }
            WaitAnyKeyPressed(String.Format("{0} instance instance has been closed.", progAppID));

            // ==============================================================================
            WriteStageHeader("Stage 3. End");

            // releasing object
            Console.WriteLine();
            try
            {
                Console.WriteLine("TRY: Marshal.ReleaseComObject( < progObj > )");
                Marshal.ReleaseComObject(progObj);
            }
            catch (Exception ex)
            {
                WriteException(ex);
            }


            WaitAnyKeyPressed("...quiting...");
        }

        #region Utilities

        /// <summary>
        /// Writes exception information
        /// </summary>
        /// <param name="ex">Exception object</param>
        static void WriteException(Exception ex)
        {
            Console.WriteLine("...CATCH exception:");
            Console.WriteLine("----------------------------------------------------------");
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.ToString());
            Console.WriteLine("----------------------------------------------------------");
        }

        /// <summary>
        /// Writes string message and waits for any key to be pressed.
        /// </summary>
        /// <param name="msg">Single line message</param>
        static void WaitAnyKeyPressed(string msg)
        {
            Console.WriteLine();
            Console.WriteLine(msg);
            Console.WriteLine("Press any key to continue....");
            Console.ReadKey();
        }

        /// <summary>
        /// Writes stage header
        /// </summary>
        /// <param name="msg">Single line message</param>
        static void WriteStageHeader(string msg)
        {
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("==============================================================================");
            Console.WriteLine(msg);
            Console.WriteLine();
        }

        #endregion


    }
}
IvanShkuropadsky вне форума  
 
Непрочитано 22.07.2011, 15:59
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


тему посмотрел по диагонали... Имхо тебе лучше по обозначенной проблеме в ADN написать, а не на этом форуме вопросы задавать. Тут по .Net глухо - в основном лисп...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 22.07.2011, 22:08
1 | #4
Олег (jr.)

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


Это известная прблема, ищи на MSDN
Там предлагают обходить временной установкой соответствующей культуры
Для примера смотри начало метода
Код:
[Выделить все]
      public static void addRaster(string fname,string iname)
        {


            System.Threading.Thread thisThread = System.Threading.Thread.CurrentThread;

            thisThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

            string appProgID = "Autocad.Application";

            // get reference on interface IDispatch
            Type AcadType = Type.GetTypeFromProgID(appProgID);

            // start Acad
            object AcadApp = Activator.CreateInstance(AcadType, false);

            AcadTools.SetProperty(AcadApp, "Visible", true);

            object AcadDocs = AcadTools.GetProperty(AcadApp, "Documents");

            // try open file
            object AcDoc = AcadTools.InvokeObject(AcadDocs, "Open", fname, false);//read-only =false

            object Util = new object();

            object Model = new object();

            AcDoc = AcadTools.GetProperty(AcadApp, "ActiveDocument");

            Model = AcadTools.GetProperty(AcDoc, "ModelSpace");

            Util = AcadTools.GetProperty(AcDoc, "Utility");

            try
            {

                AcadTools.InvokeAction(AcadApp, "ZoomExtents");

                object insPoint = Util.GetType().InvokeMember("GetPoint", BindingFlags.InvokeMethod, null, Util, null);

                AcadTools.InvokeAction(Model, "AddRaster", iname, insPoint, 10000.0, 0.0);

                AcadTools.InvokeAction(AcadApp, "ZoomExtents");

                string msg = "MsgBox \"Program ended up succesfully. closing drawing " + "\"" + ", 0 , " + "\"***  Insert Image Example   *** [fixo() 2011]\"";

                AcadTools.InvokeAction(AcadApp, "Eval", msg);

                msg = "thisdrawing.close vbtrue";

                AcadTools.InvokeAction(AcadApp, "Eval", msg);

                AcadTools.InvokeAction(AcadApp, "Quit");
            }
            catch (System.Exception ex)
            {

                AcadTools.InvokeAction(Util, "Prompt", "\nError:\n" + ex.StackTrace);
            }
            finally
            {
            }
        }
Проверял с 2007 по 2010-й (только 32 битный Автокад) Win7
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 26.07.2011, 10:23
#5
IvanShkuropadsky


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


Олег (jr.)
Спасибо за совет, но не помогло.
в MSDN есть похожая информация для офисных приложений Microsoft, но здесь, видимо, другой случай.

AutoCAD - русский, Windows 7 - русская
IvanShkuropadsky вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Проблема с запуском на Windows 7 из другого .NET приложения (COMException 80080005)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный Ax3 LISP 9 08.02.2011 14:11
Программеры, где моя ошибочка? {Smirnoff} Программирование 11 01.03.2004 11:08