Вход | Регистрация
 
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) А зачем тебе ВК?


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