Имя: Пароль:
1C
1C 7.7
v7: Подключить dll написанную на c# к 1с 7.7
0 самолет
 
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();
1 Serginio1
 
08.11.16
16:43
2 Serginio1
 
08.11.16
16:46
Или переделай свою библиотеку под СОМ 64-битная COM компонента GoldParser помогите сделать
3 Ёпрст
 
08.11.16
17:01
4 Serginio1
 
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");
6 Serginio1
 
08.11.16
17:15
Я же тебе ссылочку дал. Там ссылки на статьи, исходники и DLL

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

регистрация в системе
15 самолет
 
08.11.16
17:52
(12) регистрация regasm или regsvr32?
16 самолет
 
08.11.16
17:53
(11) если не получится то так и сделаю
17 dmitryds
 
08.11.16
17:53
(15) regasm
18 dmitryds
 
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 взаимодействия"? Эта галочка?
21 Serginio1
 
08.11.16
18:03
(19) Ты 2 то читал?

Для каждого класса нужно прописать
[ComVisible(true)]
[ProgId("Project1.Class1")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("Твой-GUID-4276-928A-8B91C9891FF1")]
22 Serginio1
 
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 реализуют. Это что обязательно? Без этого не будет работать?
24 Serginio1
 
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с...
26 Serginio1
 
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/
Если, что непонятно подскажу
27 Serginio1
 
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, тут всё через задницу немножко.
39 Serginio1
 
09.11.16
14:44
(30) Ты вообще читаешь, что тебе пишут? Смотри 24
40 Serginio1
 
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) ну вот и переноси. про остальные механизмы тоже не забудь :)
43 Serginio1
 
09.11.16
16:26
(41) А зачем тебе ВК?