|
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) да регестрацию я ручками делаю
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |