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