Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Зависание процесса в памяти


Автор: DrunkProgrammer 24.4.2008, 10:58
В общем продолжаю писать компоненту для 1С  smile . После закрытия 1С, сам процесс 1cv7.exe остается висеть в памяти. 
Я уже и присваивал переменным null и Marshal.Release(Marshal.GetIDispatchForObject(Объект)) использовал и GC.Collect();
  GC.WaitForPendingFinalizers();, а 1С-ка собака все равно висит.  smile 

Автор: _hunter 24.4.2008, 11:17
этот вопрос проще на форуме 1C-ников задать -- вряд ли проблема специфична для шарпа...

Добавлено через 2 минуты и 54 секунды
кстати вот:
http://www.kb.mista.ru/article.php?id=62

Автор: DrunkProgrammer 24.4.2008, 11:24
Этот косяк появляется, когда использую свою компоненту.

Автор: Veitmen 24.4.2008, 11:33
Я конечно профан в вопросах с 1С... Но нельзя просто процесс убить?

Автор: DrunkProgrammer 24.4.2008, 11:36
Его конечно можно просто убить, да только после каждого выхода из 1С "просто убивать" процесс - не есть нормально.

Автор: DrunkProgrammer 24.4.2008, 12:04
В общем разобрался smile.
Вот пример компоненты на C# для 1С 7.7 с получением и использованием 1С-оского класса:

Код

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace AddIn
{
    [Guid(@"AB634001-F13D-11D0-A459-004095E1DAEA"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IInitDone
    {
        void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection);
        void Done();
        void GetInfo([MarshalAs(UnmanagedType.SafeArray,
                SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo);
    }

    [Guid("AB634004-F13D-11D0-A459-004095E1DAEA"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IAsyncEvent
    {
        void SetEventBufferDepth(Int32 depth);
        void GetEventBufferDepth(ref Int32 depth);
        void ExternalEvent([MarshalAs(UnmanagedType.BStr)] String source,
                                     [MarshalAs(UnmanagedType.BStr)] String message,
                                     [MarshalAs(UnmanagedType.BStr)] String data);
        void CleanBuffer();
    }





    [ComVisible(true), ProgId(@"AddIn.ExcelReader"),
    Guid(@"9F0CF3B4-B799-4852-8293-9BB9500A3099"),
    ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class ExcelReader : IInitDone
    {
        public static Object pCon = new object();

        public ExcelReader(){}
      
        public void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection)
        {
            try
            {
                pCon = pConnection;
            }
            catch
            {
                throw new COMException(@"Unknown object context ");
            }
        }

        public void Done()
        {         
        }

        public void Test()
        {
            object obj1C = pCon.GetType().InvokeMember("AppDispatch", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, pCon, null);
            Object[] Args = new Object[1];
            Args[0] = "ТаблицаЗначений";
            object Object1C = obj1C.GetType().InvokeMember("CreateObject", BindingFlags.GetProperty, null, obj1C, Args);

            Args[0] = "Должность";
            Object1C.GetType().InvokeMember("НоваяКолонка", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, Args);

            Args[0] = "Зарплата";
            Object1C.GetType().InvokeMember("НоваяКолонка", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, Args);

            Object1C.GetType().InvokeMember("НоваяСтрока", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, null);


            Object1C.GetType().InvokeMember("УстановитьЗначение", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, new object[] { 1, "Должность", "Программер" });

            Object1C.GetType().InvokeMember("ВыбратьСтроку", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, null);

            Marshal.Release(Marshal.GetIDispatchForObject(Object1C));
            Marshal.ReleaseComObject(Object1C);
        }



        public void GetInfo([MarshalAs(UnmanagedType.SafeArray,
        SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo)
        {
            pInfo[0] = @""; 
        }      
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)