Имя: Пароль:
1C
1С v8
C# Com Объект
0 alexei366
 
25.05.13
03:29
тут по примеру статьи http://infostart.ru/public/151246/  сделал ком объект. Начал играться, добавлять методы разные, потом захотел добавить переменные в клас, чтобы они отображались у ком объекта как свойства, и чтоб их можно было установить или прочитать, и на этом моменте у меня проблема. В классе вроде добавляю  переменную с get, set но чот при выщове ком объекта в 1С он мне переменную не показывает эту, зато показывает какуюто ToString (строка) с именем моего ком объекта, откуда эта ToString взялась я тож не пойму.

Кто сможет меня просветить?
1 Ненавижу 1С
 
гуру
25.05.13
07:39
свойства это свойства, поля это поля... показывай как добавлял, они public?

ToString - виртуальный метод Object
2 alexei366
 
25.05.13
11:06
[Guid("1A11F761-87A2-434C-BB44-4569E8906776"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(CSH_COM_Events))]
   public class CSH_COM_Class2 : CSH_COM_Class1
   {


       public int ch { get; set; }
       

       public string TestString(string val)
       {
           return "55"+val+"7887";
       }
}
3 alexei366
 
25.05.13
11:08
(1) а почему тогда этот "Метод" ToStrig отображается в 1С ком объекте как его свойство
4 AaNnDdRrEeYy
 
25.05.13
11:22
если ты делал точно так же как по ссылке в (0) то добавь свои свойства вот в этот интерфейс
[Guid("6844AACB-9194-46bf-81AF-9DA73EE687DC")]
       internal interface IMyClass
       {
           [DispId(1)]
           //4. описываем методы которые можно будет вызывать из вне
           string PrintIn1C(string mymessage);
           void OpenCD(bool MyParam);
           string GetAllSystemProcess();
           void SpeakVoice(string SpeakText);
           //ВОТ СЮДА ДОБАВЬ СОВЕ СВОЙСТВО

       }
5 alexei366
 
25.05.13
11:30
(4) Фигов, пишет ошибку, дескать "нечего делать свойствам в интерфейсе, не по людски это"
6 alexei366
 
25.05.13
11:40
Апп
7 AaNnDdRrEeYy
 
25.05.13
11:44
(5) да прямо уж еще как можно
http://msdn.microsoft.com/en-us/library/64syzecx(v=vs.80).aspx
8 alexei366
 
25.05.13
12:00
Вот    ж о п а, я фигею, я блин не ожидал. Оказывается это свойство тупо не отображается в отладчике 1С но если к нему обратиться то всё ОК. Блин неужели по людски не сделать, или из-за того что это .NET ком объект иначе не получится?
9 AaNnDdRrEeYy
 
25.05.13
12:12
я думаю это не в net дело а в отладчике 1С.
10 alexei366
 
25.05.13
12:25
(9) ну а почему тогда создавая ком экселя, там свойства просматриваются в отладчике
11 Serginio1
 
25.05.13
12:51
(8) Для того, что бы отображfлись свойства объект должен поддерживать  ITypeInfo и поддерживать IDispatch

Посмотри v8: Вопрос по NetObjectToIDispatch
12 Serginio1
 
25.05.13
13:00
13 alexei366
 
25.05.13
14:17
(11) (12) Чот не получилось, в шарпе где отлько он позволил установил:

[DispId(2), ComVisible(true),  ComAliasName("ch")]
       int ch { get; set; }


И в классе

[ComVisible(true), ComAliasName("ch")]
       public int ch
       {
           get { return _ch; }
           set
           {
               _ch = value + value;
           }
       }



И так не катит, всеравно 1С не видит
14 oleg_km
 
25.05.13
16:02
(14) В отладчике или интелесенс конфигуратора?
15 Serginio1
 
25.05.13
17:25
Сделай
[Guid("1A11F761-87A2-434C-BB44-4569E8906776"),   [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
16 Serginio1
 
25.05.13
17:57
Вернее    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
17 MaximRodnik
 
25.05.13
18:14
Как-то не так все обстоит. Надо сделать иначе.
18 alexei366
 
25.05.13
21:55
(16) Сделал, как ты показал для интерфейса, не помогло
19 alexei366
 
25.05.13
21:56
(17) Так расскажи, а лучше покажи как
20 alexei366
 
25.05.13
21:58
(14) В конфигураторе 1С, в вижуал я хз как запускать библиотеку, хотя наверно создать консольное приложение и добавить линку на библиотеку.
21 alexei366
 
25.05.13
23:08
Есть ещё у кого какие мысли?
22 Serginio1
 
26.05.13
10:41
Попробуй зарегистрировать библиотеку http://msdn.microsoft.com/ru-ru/library/tzat5yw6.aspx
23 alexei366
 
26.05.13
11:49
(22) Не ну ясен фиг я через regasm делаю, этож нет, я как понимаю через regsvr32 моя фигня и не будет регестрироваться.
24 Serginio1
 
26.05.13
12:30
С ключем /tlb
25 alexei366
 
26.05.13
13:59
(24) именно так и делаю
26 alexei366
 
26.05.13
13:59
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /tlb CSH_COM.dll
27 Serginio1
 
26.05.13
16:34
(26) Там разные ключи используются для регистрации объекта обычно /codebase
для регистрации библиотеки типов

Вообщето регистрирунтся так regasm assemblyFile [options]
то есть
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm CSH_COM.dll /tlb

Приведенная ниже команда регистрирует все открытые классы, содержащиеся в myTest.dll, а также создает и регистрирует библиотеку типов myTest.tlb, в которой содержатся описания всех открытых типов, находящихся в myTest.dll.
regasm myTest.dll /tlb:myTest.tlb

можешь посмотреть, что она зарегистрирует
28 alexei366
 
26.05.13
23:00
(27) Лады завтра попробую, а то после шашлыков както западло
29 alexei366
 
27.05.13
00:31
(27) Обе команды не дали результата, все также не видать свойств объекта, а если обратиться к ним но все ок
30 Serginio1
 
27.05.13
10:50
Специально ради интереса создал файл
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace ТестСвойств
{
   [GuidAttribute("022D468F-A71F-4E9E-8869-76E7B2ECA0CB")]
   [InterfaceType(ComInterfaceType.InterfaceIsDual)]
   public interface IТестСвойств
   {
       [DispId(1)]
       string тест();
       [DispId(2)]
       int ch { get; set; }

   }

   [ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true), Guid("B6A953D3-B0AB-4A36-A067-BF17B50B484D"), ProgId("ТестСвойств")]

   public class ТестСвойств : IТестСвойств
   {
       #region IТестСвойств Members

       public string тест()
       {
           return "тест";
       }

       public int ch
       {
           get
           {
               return 1;
           }
           set
           {
               ;
           }
       }

       #endregion
   }
}

В опциях проекта поставил галочки в Build
Register for Com Interface
В assembly information
Make assembly COM-Visible


объект=новый COMОбъект("ТестСвойств");
   Ответ=Объект.Тест();
   Сообщить(Ответ);
   Свойство=Объект.ch;
   Сообщить(Свойство);
Показывает свойства
ToString ТестСвойств.ТестСвойств строка
ch       1                       число

Правда у меня версия 8.3
31 Serginio1
 
27.05.13
11:13
При этом если использовать NetObjectToIDispatch то свойства объектов тоже видны
32 alexei366
 
28.05.13
15:44
(31) Надо будет попробывать, щас не могу, так что отпишусь навверно завтра
33 alexei366
 
21.06.13
11:35
(31) блин я слишком глуп, объясни как использовать (где прописать) NetObjectToIDispatch
34 oleg_km
 
21.06.13
11:49
(33) Serginio1 сделал оболочку на .NET, которая "делает" любой объект .NET COM-объектом и соответственно доступным для 1С. Фактически 1С'у становится доступен NET Framework без написания дальнейшего кода в среде C#. Ну за исключение всяких там делегатов, DLLImport, и других конструкций языков .NET, отсутствующих в 1С. Нечто похожее сделал и коммерчески продвигает Elisy
35 Serginio1
 
21.06.13
12:16
(33) Просто скомпилируй исходники и зарегистрируй. Например

public string ЗапуститьПриложение(string путь, string КоманднаяСтрока)
       {
           string i = путь;
           if (!System.IO.File.Exists(i))
           {

               return "Файл не найден";
           }
           try
           {
               System.Diagnostics.Process p = new System.Diagnostics.Process();
               //    p.EnableRaisingEvents = false;
               //    p.StartInfo.CreateNoWindow = false;
               p.StartInfo.FileName = i;
               p.StartInfo.Arguments = КоманднаяСтрока; //(Аргументы командной строки)
               p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
               p.Start();
               p.WaitForExit();
           }
           catch (Exception e)
           {

               return e.Message;
           }
           return "";
       }

       public string GetSysPath(string ИмяПеременной)
       {
           string path = System.Environment.GetEnvironmentVariable(ИмяПеременной);
           //  path = System.Environment.GetEnvironmentVariable("%" + ИмяПеременной + "%");
           if (!path.EndsWith("\\")) path += "\\";
           return path;
       }

       private void button2_Click(object sender, EventArgs e)
       {
            var Приложение = GetSysPath("Windir");
           var Приложение32 = Приложение + @"Microsoft.NET\Framework\v4.0.30319\regasm.exe";
           var Приложение64 = Приложение + @"Microsoft.NET\Framework64\v4.0.30319\regasm.exe";

           string filename;
           //Если диалог отображен и нажата кнопка выбрать
           if (openFileDialog1.ShowDialog() == DialogResult.OK)
           {
               //Имя файла и директории хранитя в войстве FileName как строка
               filename = openFileDialog1.FileName;
               ///codebase

               var КоманднаяСтрока = @"""" + filename + @""" " + @"/codebase";

               if (System.IO.File.Exists(Приложение32))
               {
                   ЗапуститьПриложение(Приложение32, КоманднаяСтрока);
                   textBox1.Text = Приложение32 + " " + КоманднаяСтрока;
               }
               if (System.IO.File.Exists(Приложение64))
               {
                   ЗапуститьПриложение(Приложение64, КоманднаяСтрока);
                   textBox1.Text = Приложение64 + " " + КоманднаяСтрока;
               }
           }
       }
36 alexei366
 
21.06.13
12:17
(34) У меня пока цель такая, пишу код в C# с вызовом библиотек и т.д, что или невозможно в 1С или требует изобретение велосипеда, и предоставляю функционал через ком объект 1С-у.

Щас у меня все работает так как надо, остался только один вопрос какого х..я в отладчике при просмотре через "Шифт-F9" не отображаются свойство Ком-Объекта которые я задавал, есть только одно "ToString", ну а если обратитьтся к свойством ком-объекта то все ок.
37 alexei366
 
21.06.13
12:19
(35) да регестрацию я ручками делаю
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший