Имя: Пароль:
1C
1С v8
Помогите с внешней компонентой С#
, ,
0 yolops
 
26.01.14
00:02
Здравствуйте. Нашел шаблон внешней компоненты и хотел разобраться с ним. Все функции работают нормально, но не могу добавить генерацию внешнего события. Выдает ошибку. В чем дело?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime;


namespace CL2
{
    public interface ASignatures
    {
        int s();
        string FName();
        void TestExtEvent([MarshalAs(UnmanagedType.BStr)] String msg);
    }

    internal static class ExternalAddIn
    {
        internal static Object App; //Объект внешней компоненты
        internal static IAsyncEvent ExtEvent; //Внешнее событие

    }

    [Guid("AB634001-F13D-11d0-A459-004095E1DAEA")]// стандартный GUID для IInitDone ссылка http://soaron.fromru.com/vkhints.htm
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IInitDone
    {
        /// <summary>
        /// Инициализация компонента
        /// </summary>
        /// <param name="connection">reference to IDispatch</param>
        void Init(
          [MarshalAs(UnmanagedType.IDispatch)]
    object connection);

        /// <summary>
        /// Вызывается перед уничтожением компонента
        /// </summary>
        void Done();

        /// <summary>
        /// Возвращается инициализационная информация
        /// </summary>
        /// <param name="info">Component information</param>
        void GetInfo(
          [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
    ref object[] info);
    }

    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();
    }

    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class ArsClass : ASignatures, IInitDone
    {
      
        private IAsyncEvent asyncEvent = null;
        //private IStatusLine statusLine = null;

        /// <summary>
        /// Инициализация компонента
        /// </summary>
        /// <param name="connection">reference to IDispatch</param>
        public void Init(
          [MarshalAs(UnmanagedType.IDispatch)]
  object connection)
        {
            try
            {
                ExternalAddIn.App = connection;
                asyncEvent = (IAsyncEvent)connection;
            }
            catch
            {
                throw new COMException(@"Unknown object context");
            }
        }

        /// <summary>
        /// Возвращается информация о компоненте
        /// </summary>
        /// <param name="info">Component information</param>
        public void GetInfo(
          [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
  ref object[] info)
        {
            info[0] = 2000;
        }

        public void Done()
        {
            ExternalAddIn.App = null;
            ExternalAddIn.ExtEvent = null;
        }

        public string FName()
        {
            return "Arsen";
        }
        public int s()
        {
            int a = 1;
            int b = 2;
            int c = a + b;
            return c;
        }

        public void TestExtEvent([MarshalAs(UnmanagedType.BStr)] String msg) //Метод компоненты, вызываемый в 1С
        {
           try
           {
               ExternalAddIn.ExtEvent.ExternalEvent(@"DotNetAddInSample", @"TestExtEvent", @"Test message for, " + msg + @" !");//Генерация внешнего события
           }
           catch
           {
               throw new COMException(@"Failed to execute TestExtEvent() method");
           }
        }
    }
}
1 yolops
 
26.01.14
00:13
как можно запустить отладку этой компоненты в vs?
2 Принт
 
26.01.14
00:14
так же как отладку dll
3 yolops
 
26.01.14
01:07
у меня почему то не срабатывает метод init
4 Serginio1
 
26.01.14
11:32
Я использую
SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
            Sc = SynchronizationContext.Current;


и

Sc.Send(d => Событие(), null);
v8: v8: Использование сборок .NET в 1С 7.x и 8.x
5 Serginio1
 
26.01.14
11:34
6 yolops
 
26.01.14
16:32
может есть рабочий пример? Можете скинуть? [email protected]
7 Serginio1
 
26.01.14
17:05
(6) Если почитаешь 5 то найдешь ссылки
http://www.rsdn.ru/forum/dotnet/3471534.1
http://www.rsdn.ru/article/dotnet/cs1c.xml
8 Serginio1
 
26.01.14
17:23
Кроме того 8 ка поддерживает события
v8: v8: Использование сборок .NET в 1С 7.x и 8.x
v8: v8: Использование сборок .NET в 1С 7.x и 8.x

Исходники и примеры можешь скачать отсюда
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=142&lid=9569
9 yolops
 
26.01.14
19:47
Serginio1 спасибо! реально помог!
10 yolops
 
27.01.14
13:41
Еще проблема. Компоненту написал, все работает. Скопировал dll и tbl и pdb файлы на другой комп, зарегистрировал, все ок, но 1с не хочет коннектится к компоненте. ПодключитьВнешнююКомпоненту возвращает 0
11 yolops
 
27.01.14
13:47
регистрирую так:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe  "C:\Debug\myTestLib.dll" /tlb
Запись в регистре есть
12 yolops
 
27.01.14
13:53
Все разобрался, зарегистрировал так:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe  "C:\Debug\myTestLib.dll" /codebase
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ngen.exe  "C:\Debug\myTestLib.dll"
13 Serginio1
 
27.01.14
15:07
(12) в 8 есть специальная регистрилка для Net
РегистрацияКомСервера.exe