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