Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Подключить dll написанную на c# к 1с 7.7

v7: Подключить dll написанную на c# к 1с 7.7
Я
   самолет
 
08.11.16 - 16:41
Есть написанная dll на С#. Хочу ее подключить к 1с 7.7. Нужна для XSLT трансформаций.
Пока пытаюсь вызвать метод Start чтобы увидеть что она работает. Но не получается.
Может кто подскажет в чем моя ошибка....
0) Создал на шарпе dll 
Вот ее код на С#


using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
namespace MyDll
{
    public class Transform
    {
        public void start()
        {
            Console.WriteLine("Тестирование прошло успешно");
            Console.ReadLine();
        }
                
        public void test()
        {            
            // Прочитать хмл файл

            XmlDocument fXML = new XmlDocument();
            fXML.Load("D:/1.xml");
            // Прочитать хслт файл

            string fXSLT = "D:/3.xsl";
            // Трансформировать

            fXSLT = DoTransform(fXML,fXSLT);
            //Вывести в консоль результат

            Console.WriteLine(fXSLT);
            Console.ReadLine();                
        }
            
        public string DoTransform(XmlDocument fileXML , string fXSLT)
        {
              XslCompiledTransform xslt = new XslCompiledTransform();
              xslt.Load(fXSLT);
              StringWriter writer = new StringWriter();
              xslt.Transform(fileXML, null, writer);
              string XMLout = writer.ToString();
              writer.Close();
              return XMLout;
        }
    }
}



1)Библиотеку при сборке на закладке "Подписывание" поставил галочку "Подписать сборку" и
создал файл с ключем без пароля.

2)После зарегистрировал через
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /codebase "C:\Users\admin\Documents\Visual Studio 2015\Projects\ClassLibrary1\ClassLibrary1\bin\x86\Debug\MyDll.dll"
регистрация прошла успешно.
3) Проверил как она подключается из консольного приложения С#. Тоже работает
4) Стал в 1с 7.7 подключать ругается на

    try
        ЗагрузитьВнешнююКомпоненту("C:\Users\karluk\Documents\Visual Studio 2015\Projects\ClassLibrary1\ClassLibrary1\bin\x86\Debug\MyDll.dll");
    except 
        message("На загружена внешняя компонента");    
    endtry; 
    
Ошибка при создании объекта из компоненты C:\Users\admin\Documents\Visual Studio 2015\Projects\ClassLibrary1\ClassLibrary1\bin\x86\Debug\MyDll.dll (отсутствует CLSID)
ОБОЙТИ НЕ ПОНЯЛ КАК....


5)Взял в реесте нашел по имени MyDll CLSID
Попробывал сделать 

    
    Если ЗагрузитьВнешнююКомпоненту("vkloader.dll")=0 тогда 
        Сообщить("компонента vkloader.dll не загружена","!!!");
    Иначе
        Сообщить("компонента vkloader.dll загружена");
    КонецЕсли;  
    
    Загрузчик = СоздатьОбъект("ЗагрузчикВК"); 
        
    try
        Результат = Загрузчик.ЗагрузитьВК("C:\Users\admin\Documents\Visual Studio 2015\Projects\ClassLibrary1\ClassLibrary1\bin\x86\Debug\MyDll.dll","AddIn.Transform=238A3FA9-961C-356E-977A-10B99D990300");
        сообщить(Результат);
    except 
        message("На загружена внешняя компонента");    
    endtry;         
                       
    t = CreateObject("AddIn.Transform");//ВОТ ЗДЕСЬ ОШИБКА "{D:\1C\!!!LAST\EXTFORMS\ЭЛЕКТРОННЫЙ РЕЦЕПТ.ERT(126)}: Неудачная попытка создания объекта (AddIn.Transform)"  

    t.Start();
 
 
   Serginio1
 
1 - 08.11.16 - 16:43
   Serginio1
 
2 - 08.11.16 - 16:46
Или переделай свою библиотеку под СОМ 64-битная COM компонента GoldParser помогите сделать
   Ёпрст
 
3 - 08.11.16 - 17:01
   Serginio1
 
4 - 08.11.16 - 17:11
(3) Там и писать то ничего не надо. Используй напрямую XmlDocument , XslCompiledTransform и StringWriter
   самолет
 
5 - 08.11.16 - 17:13
NetObjectToIDispatch45 это библиотека сторонняя? ее нужно подключить?
врап=СоздатьОбъект("NetObjectToIDispatch45");
//врап=СоздатьОбъект("NetObjectToIDispatch");

//Infrascturcture=Врап.ПолучитьТипИзСборки("HelloWorldLibrary.Infrascturcture",ПутьКСборке_Или_Имя_ДЛЛ_Если_В_GAС);
MyDll=Врап.ПолучитьТипИзСборки("MyDll.Transform","C:\Users\karluk\Documents\Visual Studio 2015\Projects\ClassLibrary1\ClassLibrary1\bin\x86\Debug\MyDll.dll");
MyDll.Start();

вот так выдает ошибку не могу создать ("NetObjectToIDispatch45");
   Serginio1
 
6 - 08.11.16 - 17:15
Я же тебе ссылочку дал. Там ссылки на статьи, исходники и DLL

Использование классов .Net в 1С для новичков
   самолет
 
7 - 08.11.16 - 17:17
сп. счас попробую разобраться...
   Serginio1
 
8 - 08.11.16 - 17:17
Start то куда Console будет выводить,
   самолет
 
9 - 08.11.16 - 17:32
да консоль
   самолет
 
10 - 08.11.16 - 17:32
это метод для теста чтобы увидеть что подключилась длл
 
 Рекламное место пустует
   Serginio1
 
11 - 08.11.16 - 17:34
Почитай http://catalog.mista.ru/public/448668/
У тебя всго 3 типа XmlDocument , XslCompiledTransform и StringWriter . Можешь веськод написать в 1С без этой DLL
   dmitryds
 
12 - 08.11.16 - 17:41
(0) галка com-объект в настройках.
потом регистрация
потом подключать по имени объекта через СоздатьОбъект (никаких путей)
   dmitryds
 
13 - 08.11.16 - 17:41
(12) + и никаких вклоадеров
   dmitryds
 
14 - 08.11.16 - 17:42
(12) >> потом регистрация 

регистрация в системе
   самолет
 
15 - 08.11.16 - 17:52
(12) регистрация regasm или regsvr32?
   самолет
 
16 - 08.11.16 - 17:53
(11) если не получится то так и сделаю
   dmitryds
 
17 - 08.11.16 - 17:53
(15) regasm
   dmitryds
 
18 - 08.11.16 - 17:56
библиотека для 1С77 делается просто...

Создаем сборку, добавляем публичный объект (например мойОбъект), ставим флаг COM, добавляем публичные методы в объект.
регистрируем в системе

в 77 создаем объекты через мойОбъект = СоздатьОбъект("мойОбъект"); 
и пользуемся его публичными методами.

И никакого дополнительного левого софта не нужно
   самолет
 
19 - 08.11.16 - 18:00
(18)"МойОбъект" это только  имя класса в шарпе Например:   Addin.Tranform? или нужно еще namespace добавлять Addin.MyDll.Tranform?

Mydll это namespace
Tranform это класс
   самолет
 
20 - 08.11.16 - 18:02
И галочка COM ставится на закладке "Сборка-Регистрация для COM взаимодействия"? Эта галочка?
   Serginio1
 
21 - 08.11.16 - 18:03
(19) Ты 2 то читал?

Для каждого класса нужно прописать
[ComVisible(true)]
[ProgId("Project1.Class1")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("Твой-GUID-4276-928A-8B91C9891FF1")]
   Serginio1
 
22 - 08.11.16 - 18:04
ProgId это мойОбъект

Guid формируй в сервисе
   самолет
 
23 - 09.11.16 - 00:51
сделал под COM. т.е добавил классу
[ComVisible(true)] 
[ProgId("Project1.Class1")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("Твой-GUID-4276-928A-8B91C9891FF1")]
 сейчас ругается Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует интерфейс IInitDone)

Посмотрел примеры там целые интерфейс IInitDone реализуют. Это что обязательно? Без этого не будет работать?
   Serginio1
 
24 - 09.11.16 - 09:59
Зачем тебе ВК?
СоздатьОбъект("Project1.Class1"); 

 Кстати по ссылке из 1 есть ссылка на ФайлыNetObjectToIDispatch

http://files.rsdn.org/19608/%d0%a4%d0%b0%d0%b9%d0%bb%d1%8bNetObjectToIDispatch.zip

Где лежат примеры, DLL и там есть РегистрацияКомСервера.exe
для интерактивной регистрации COM DLL
   самолет
 
25 - 09.11.16 - 10:04
Просто до конца не могу помять создания COM dll. По описанию вроде как отличается только директивами перед классом и интерфейсом и галочками в настройках. Но вчера ночью качал примеры с сайта по ссылке которую ты давал и они тоже при сборке регистрируются но при подключении к 1с валятся с ошибкой что "неизвестная компонент". Сейчас уже хочется довести до конца и понять как можно делать СОМ dll для 1с...
   Serginio1
 
26 - 09.11.16 - 10:21
Вот пошаговое создание СОМ библиотеки

https://blogs.msdn.microsoft.com/asiatech/2011/12/05/how-to-develop-and-deploy-activex-control-in-c/

 Но вообще проще использовать (1)

Там вообще можно не писать DLL. А для семерки проще использовать одну NetObjetToIDispatch45.dll зарегистрировать её, а все остальные библиотеки подгружать через неё. Смысл в ней в том, что она любой объект оборачивает в COM объект.

Потрать немного время на http://catalog.mista.ru/public/448668/
Если, что непонятно подскажу
   Serginio1
 
27 - 09.11.16 - 10:24
(26) И почитай внутри папки есть NetObjectToIDispatch.docx
Зарегистрировать можешь через  RegAsm.bat запустив от администратора в папке DLLNetObjetToIDispatch45 рядом с NetObjetToIDispatch45.dll
   Кирпич
 
28 - 09.11.16 - 10:26
(25) найди в интернете какой нибудь ликбез про COM.
иначе ты так будешь методом тыка месяц делать то, что обычные люди делают за пять минут.
   самолет
 
29 - 09.11.16 - 13:59
(26) это я посмотрю спасибо.
   самолет
 
30 - 09.11.16 - 14:04
Добавил в Шарпе все дерективы
смотрел примеры
http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C



Код с#:
using System;
using System.Runtime.InteropServices;
namespace MyDll{
   [Guid("68F9ECEF-B19A-4F8B-AE0F-47B16180D52C"),ComVisible(true)]
   public interface iTransform   {
     void start();    
   }
   [ClassInterface(ClassInterfaceType.AutoDual),ProgId("Addin.Tranform"),Guid("F62AA00E-235B-488C-BD81-D7A8470B3EDF"),ComVisible(true)]
   public class Transform : iTransform {
     public void start() {
       Console.WriteLine("Тестирование прошло успешно");
       Console.ReadLine();
     }
   }
}

Код 1с:
    ИмяВК="Addin.Tranform";
    ок=ПодключитьВнешнююКомпоненту(ИмяВК);
    Если ок=0 Тогда
       Сообщить("Не удалось подключить компоненту "+ИмяВК);
    КонецЕсли;
    net =СоздатьОбъект(ИмяВК);
    
    
Библиотеку регистрировал через РегистрацияКомСервера.exe
и через regasm все регистрируется но 
Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует интерфейс IInitDone)
Не удалось подключить компоненту Addin.Tranform

Вопрос: вот это интерфейс IInitDone он обязательно должен присудствовать в dll или он не нужен?
Нигде кроме примера не нашел об этом информацию...
   Кирпич
 
31 - 09.11.16 - 14:22
Если ты пишешь просто COM dll, то не надо реализовывать интерфейсы ВК (IInitDone и прочие). Загружать такую dll нужно через СоздатьОбъект(ИмяВК) и обязательно регистрировать в реестре.
Если ты делаешь полноценную ВК, то обязательно в ней должен быть IInitDone.
   Кирпич
 
32 - 09.11.16 - 14:22
и ЗагрузитьВнешнююКомпоненту(ИмяВК);
   Кирпич
 
33 - 09.11.16 - 14:24
и прочитай наконец доку от 1С. не позорь светлое звание одинесника.
 
 
   самолет
 
34 - 09.11.16 - 14:31
Вот Это из ссылки выше


Книга знаний: Написание внешних компонент для 1С на VB.NET и C#

Замечу, что метод ЗагрузитьВнешнююКомпоненту() в данной ситуации (COM-объекты на .NET) не работает, и необходимо использовать метод ПодключитьВнешнююКомпоненту().
   самолет
 
35 - 09.11.16 - 14:32
поэтому не понятно причем здесь ЗагрузитьВнешнююКомпоненту(ИмяВК);
   самолет
 
36 - 09.11.16 - 14:36
и в реестре уже 10 раз зарегистрировал и проверил
   Кирпич
 
37 - 09.11.16 - 14:39
(36) ты интерфейс IInitDone в своей ВК реализовал?
   Кирпич
 
38 - 09.11.16 - 14:40
(34) ну не работает так не работает. это же .NET, тут всё через задницу немножко.
   Serginio1
 
39 - 09.11.16 - 14:44
(30) Ты вообще читаешь, что тебе пишут? Смотри 24
   Serginio1
 
40 - 09.11.16 - 14:46
Если тебе нужна ВК то смотри опять же как реализовано

http://catalog.mista.ru/public/457898/
Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF
   самолет
 
41 - 09.11.16 - 15:04
(37) IInitDone сейчас не реализован код же я показал на шарпе. Т.е. сейчас весь механизм IInitDone из примера буду переносить в свою библиотеку.
   Кирпич
 
42 - 09.11.16 - 15:20
(41) ну вот и переноси. про остальные механизмы тоже не забудь :)
   Serginio1
 
43 - 09.11.16 - 16:26
(41) А зачем тебе ВК?


Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует