Имя: Пароль:
1C
1С v8
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
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) Как объект мучения? Есть вопросы?