|
NetObjectToIDispatch - Ошибка при вызове конструктора (COMОбъект) | ☑ | ||
---|---|---|---|---|
0
FadeevaElena
12.08.15
✎
14:37
|
Добрый день, коллеги! Помогите с проблемой.
При вызове строки кода Net = Новый COMОбъект("NetObjectToIDispatch"); Вылетает ошибка: "Ошибка при вызове конструктора (COMОбъект) Net = Новый COMОбъект("NetObjectToIDispatch"); по причине: -2147221005(0x800401F3): Недопустимая строка с указанием класса" Что ей надо? .Net 4.5.1 только что переустановила - не помогло. Процедура выполняется &НаСервере. |
|||
1
jsmith82
12.08.15
✎
14:39
|
А имя класса точное? Там постфикс из цифр не нужен?
|
|||
2
lapinio
12.08.15
✎
14:41
|
Примерно такая ситуация была. Смотрел утилитой olewiev. Класс был но ошибку выдавала. Скорей сего у тебя компонент 32 битный по пробуй на клиенте обратится
|
|||
3
Стальная Крыса
12.08.15
✎
14:47
|
Одно из двух:
1. Нет такого класса на сервере 2. Сервер х64 |
|||
4
FadeevaElena
12.08.15
✎
14:50
|
(1)точно. вот тут у человека цифры в конце есть 1с8 и NetObjectToIDispatch
А откуда взять эти цифры? (3) Да, сервер x64. И что делать? Работать не будет? |
|||
5
Serginio1
12.08.15
✎
14:56
|
А откуда ты это старье взяла?
(4) Вообще в поставке есть РегистрацияComСервера где прописывается как в том числе и 64 |
|||
6
Serginio1
12.08.15
✎
14:58
|
(4) Сейчас выложу еще новую версию с реализацией внутри сборки ВК для получения глобального контекста и его использования
|
|||
7
Serginio1
12.08.15
✎
14:59
|
Вот ссылка http://catalog.mista.ru/public/238584/
|
|||
8
Serginio1
12.08.15
✎
15:06
|
(0) То есть тебе нужно её установить на сервере и зарегистрировать через РегистрацияКомСервера.exe
Только ПрогИД у неё врап=новый COMОбъект("NetObjectToIDispatch45"); |
|||
9
Serginio1
12.08.15
✎
15:21
|
Выложил
Добавил реализацию ВК внутри сборки для получения Глобального контекста. Использование Если ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C") Тогда объект=Новый ("AddIn.GlobalContext1C"); иначе сообщить("Компонента не загружена"); КонецЕсли; Использование Внутри Net. public ТестВК(object Object1C) { this.Object1C = Object1C; ГК = new ДинамикГК(Object1C); } public string СоздатьОкно() { // m_1cApp.AppDispatch.Сообщить("Привет из ВК"); // не работает для упрощения работы создань динамический объект ДинамикГК // выполняющий аналогичную фунцию IExtWndsSupport n; ГК.Сообщить("Привет из ВК", ГК.СтатусСообщения.Важное); n = (IExtWndsSupport)Object1C; IntPtr hwnd; n.GetAppMainFrame(out hwnd); // Создаем форму, устанавливаем нативные хэндлы и устанвливаем окно 1С владельцем нетовского окна var form = new Form1(); form.CreateControl(); SetOwner(form.Handle.ToInt32(), hwnd.ToInt32()); form.EventTo1C = Object1C as IAsyncEvent; form.Show(); return "Методы ВК выполнены!"; } private async void button1_Click(object sender, EventArgs e) { var ПотокПриложения = Thread.CurrentThread.ManagedThreadId; // Для чистоты эксперимента вызовим события из потока отличного от потока приложения. // Что бы await не использовал текущий контекст установим ConfigureAwait(false) await Task.Delay(1000).ConfigureAwait(false); // делаем задержку в секунду и вызываем событие var ПотокСобытия = Thread.CurrentThread.ManagedThreadId; // Для вызова в тотоке приложения вызовем метод из его потока Sc.Send(d => EventTo1C.ExternalEvent("ДанныеИзТестВК", "Тест", string.Format("Поток Приложения={0} Поток события {1}",ПотокПриложения,ПотокСобытия)), null); // Если очень быстро кликать по кнопке то потоки события будут разными } Так же добавил возможность показать окно семерки созданное через Новый COMОбъект("V77.Application"); |
|||
10
Serginio1
12.08.15
✎
15:24
|
(0) Можешь зарегистрировать из 1С
Процедура ЗарегистрироватьDLL(filename,Разрядность="") WshShell = Новый COMОбъект("WScript.Shell"); WshSysEnv = WshShell.Environment("Process"); Сообщить(WshSysEnv.Item("SYSTEMROOT")); Путь=WshSysEnv.Item("SYSTEMROOT"); Файл=Путь+"\Microsoft.NET\Framework"+Разрядность+"\v4.0.30319\regasm.exe"; КоманднаяСтрока = """" + filename + """ " + "/codebase"; Стр=Файл+" "+КоманднаяСтрока; сообщить(стр); кодВозврата=Неопределено; ЗапуститьПриложение(стр,,истина,кодВозврата); Сообщить(кодВозврата); КонецПроцедуры Для 64 разрядной ЗарегистрироватьDLL(filename,"64"); |
|||
11
Serginio1
12.08.15
✎
15:27
|
Можешь поместить DLL в макет
Функция ЗаписатьМакет(ИмяМакета,ИмяФайла="") Если ИмяФайла="" Тогда ИмяФайла=ИмяМакета КонецЕсли; Каталог=КаталогВременныхФайлов(); Попытка ИмяФайла=Каталог+ИмяФайла+".dll"; ПолучитьМакет(ИмяМакета).Записать(ИмяФайла); исключение Сообщить(ОписаниеОшибки()); конецпопытки; возврат ИмяФайла КонецФункции тест=Новый COMОбъект("NetObjectToIDispatch45"); тест=Неопределено; Исключение ФайлNetObjetToIDispatch45=ЗаписатьМакет("NetObjectToIDispatch","NetObjetToIDispatch45"); ЗарегистрироватьDLL(ФайлNetObjetToIDispatch45,"64"); КонецПопытки; |
|||
12
MM
12.08.15
✎
15:36
|
(11) Думаю, что класть файлы dll в каталог временных файлов не правильно, у 1С есть каталог %APPDATA%\Roaming\1C\1Cv82\ExtCompT . Он под зачистку мусора попадать не должен.
Да, и с регистрацией будет проблема, если права пользователя. У RebelX было решения для решения этой проблемы. А почему место публикации такое неудобное, с регистрацией? |
|||
13
Serginio1
12.08.15
✎
15:46
|
(12) Это просто место куда можно кинуть если не зарегистрировано и гарантированно работать.
Попытка тест=Новый COMОбъект("NetObjectToIDispatch45"); тест=Неопределено; Исключение ФайлNetObjetToIDispatch45=ЗаписатьМакет("NetObjectToIDispatch","NetObjetToIDispatch45"); ЗарегистрироватьDLL(ФайлNetObjetToIDispatch45,"64"); КонецПопытки; А так регистрируй куда хочешь. |
|||
14
FadeevaElena
12.08.15
✎
15:47
|
Че-то я не понимаю, я хочу нетовские классы использовать как COMОбъект. Какую dll я должна зарегитрировать? нет у меня никакой dll.
|
|||
15
Serginio1
12.08.15
✎
15:47
|
(14) Скачай 7
|
|||
16
FadeevaElena
12.08.15
✎
15:50
|
(15) Уже. Жду, когда на почту придет. Пока не пришло.
|
|||
17
Serginio1
12.08.15
✎
16:03
|
(16) Значит не оплатила. Держи
|
|||
18
Serginio1
12.08.15
✎
16:05
|
Отправил
|
|||
19
Serginio1
12.08.15
✎
16:20
|
(0) Да для сервера нужно еще и подавить вызов ошибки
врап=новый COMОбъект("NetObjectToIDispatch45"); врап.ВыводитьСообщениеОбОшибке=ложь; попытка Врап.ВызватьКакойтоМетод(); Исключение Ошибка=врап.ПоследняяОшибка; СшибкаСтр=Ошибвка.ToString(); // Записать в журнал регистрации, вернуть на клиента итд конецпопытки; сообщить("====================="); попытка сообщить(ПолучитьДанныеССайта(врап,url+"topic.php?rd=0025")); исключение Ошибка=врап.ПоследняяОшибка; сообщить("Код ошибки "+Ошибка.InnerException.Response.StatusCode.ToString()); Сообщить(Ошибка.InnerException.Response.StatusCode.Equals(NotFound)); конецпопытки; |
|||
20
FadeevaElena
12.08.15
✎
16:30
|
(17)(18)(19) Большое спасибо! Буду мучить.
|
|||
21
Serginio1
17.08.15
✎
11:28
|
(20) Как объект мучения? Есть вопросы?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |