как использовать dll , сделанную на C# , в 1сv8 ... #436704


#0 by Ион
Подскажите пожалуйста , как использовать dll , сделанную на C# , в 1сv8 ? Что-то попробовал - не получилось.
#1 by Rie
А как именно пробовал? Сделай либо внешнюю компоненту, либо реализуй IDispatch.
#2 by xReason
#3 by Ион
(1-2) Спасибо большое за информацию, буду читать
#4 by Ион
(1-2) Сделал dll , зарегистрировал - все вроде как написано в (1-2). При вызове из 1с ошибка - "Тип не определен AddIn.МоеИмяКласса". Что возможно не так сделано ? (т.е хочу просто примитивно обратиться к свойству класса dll , получить строку "Привет от С#" , например). Спасибо большое за помощь
#5 by Armando
На ИТС есть технология создания ВК. Написано вменяемо, разбирался недолго.
#6 by jbond
>Подскажите пожалуйста , как использовать dll , сделанную на C# , в 1сv8 ? как что? сделай класс COM published - тогда как ActiveX обьект можешь использовать
#7 by Topol-M
регистрируешь так? RegAsm.exe D:1Cmydll.dll /codebase /tlb: mydll.tlb
#8 by Rie
ЗагрузитьВнешнююКомпоненту - не забыл?
#9 by Kraft
COM умирает
#10 by Kraft
+ как средство
#11 by Ион
Вот как : (в GAC эта dll есть) Вот код: (LoadComponent срабатывает , а вот нажатие на кнопку выдает ошибку "Тип не определен AddIn.Privet") =============
#12 by Rie
ЗагрузитьВнешнююКомпоненту с именем .dll в качестве параметра - не пробовал? В ресурсах dll - ресурс 100 определил? Если да - то как именно?
#13 by Ион
Вот код C# на всякий случай - может что-то не так сделано. Спасибо заранее большое.       public partial  class  PrivetClass : UserControl ,IInitDone    {                private string _privet;        public    string privet        {        }            try                  {                            throw new COMException(@"Unknown object context");              }                     }                 public void GetInfo([MarshalAs(UnmanagedType.SafeArray,           }        }    internal static class ExternalAddIn      {                public interface IAsyncEvent    {              void SetEventBufferDepth(Int32 depth);            void GetEventBufferDepth(ref Int32 depth);            void ExternalEvent([MarshalAs(UnmanagedType.BStr)] String source,
#14 by Rie
О ресурсе ответь.
#15 by Ион
Извини пожалуйста , насчет ресурса не совсем понял, можно чуть поподробнее - что мне надо было сделать с ресурсами ?
#16 by jbond
- ага. а ВК написать легче, чем COM-обьект на .NET? 8-ка научилась непосредственно подлючать сборки .NET?
#17 by Rie
Определить ресурс с номером 100 как имя объекта внешней компоненты.
#18 by Rie
+ Если используешь шаблоны с ИТС - там файл AddInStr.res посмотри.
#19 by Kraft
про восьмерку отдельный разговор )
#20 by Ион
"имя объекта внешней компоненты" - это будет в моем случае имя класса "PrivetClass" или  что ? И позволю себе вопрос : а для чего это надо? Вроде нигде в описаниях по созданию  не встречался с этим... Нет , шаблон ни с ИТС ,а из примера в
#21 by Rie
Из "Технологии внешних компонент" (правда, у меня древнее издание, может, с тех пор чего поменялось): "Создание OLE-объекта внешней компоненты При загрузке внешней компоненты функцией ЗагрузитьВнешнююКомпоненту 1С:Предприятие определяет ProgID OLE-объекта компоненты следующим образом: ProgID имеет вид <Vendor>.<Component>; в качестве первой части (<Vendor>) используется строка "AddIn"; в качестве второй части (<Component>) используется строка с ID 100 из таблицы строк компоненты. Cтрока может иметь вид "Name1|Name2|...|NameN", и в этом случае будут созданы все объекты с ProgID вида "AddIn.NameX". Если такая строка отсутствует, то используется имя файла внешней компоненты без расширения. При использовании функции ПодключитьВнешнююКомпоненту ProgID OLE-объекта компоненты передается в качестве параметра функции и также может представляться строкой вида ProgID1| ProgID2|...|ProgIDX".
#22 by Ион
Или ProgID ? === вот что добавил сейчас в плане ресурсов: AddIn.Privet    100     PrivetClass    100     == сейчас переBuild сделаю и попробую
#23 by Rie
Наоборот! ID ресурса - 100, значение ресурса - "Addin.Privet"
#24 by Ион
В VS2005 у меня в файле UserControl1.resx есть столбцы Name,Value,Comment. Делаю значит вот так:
#25 by Ион
сделал rebuild , скопировал dll  в папку bin 1с , перерегистрировал - но выдает ту же ошибку "Тип не определен AddIn.Privet" ...
#26 by Rie
Попробуй дать ресурсу имя OBJ_ID.
#27 by Ион
У меня есть подозрение , что не в этом дело. Сейчас нашел пример на C#, где вообще ProgID человек не задает. Использует имя класса далее и вроде все получается...
#28 by Ион
надо на пару часов отойти
#29 by Ион
Попробовал я переименовать файл ресурсов (просто так опции переименовать нет - я переименовал файл ресурсов , удалил ссылку в проекте на старый файл и добавил ссылку на новый "OBJ_ID.resx" -но ошибка та же). Сейчас попробую переделать все так , как советуют по ссылке в
#30 by Rie
Подожди... Ты что переименовываешь? Существенно не имя файла ресурса, а идентификатор ресурса.
#31 by Ион
т.е. то , что было "100" , поробовать сделать "OBJ_ID" ?
#32 by Rie
Ты в чём пишешь?
#33 by Ион
Попробовал переименовать Name "100" в "OBJ_ID" -  все то же. Пишу в Visual Studio 2005 C#. Или я не понял вопрос ?
#34 by Rie
Такие варианты: В ресурсном файле где Strings Name: OBJ_ID Или откомпилируй компилятором ресурсов файл .rc, содержащий STRINGTABLE BEGIN 100 AddIn.Privet END и затащи результат в свой проект. Хотя вроде бы как у тебя всё в порядке должно быть...
#35 by Ион
(АЛЛ) То что я давал ссылку в - если сделать по предложенной схеме , то тоже выдает ошибку... Да.. Может быть знает кто-нибудь волшебную ссылочку , где лежит РАБОТАЮЩИЙ пример кода на C# ? (простое обращение к методу или свойству класса из 1с) Спасибо большое.
#36 by bvn13
в закладки
#37 by Rie
Видимо, не в коде дело. Скорее, проект у тебя как-то не так собирается.
#38 by Ион
Приподнимем...
#39 by Rie
Выложи куда-нибудь свой проект целиком. Тогда можно будет глянуть, что у тебя не туда срастается.
#40 by Ион
Выложил солюшн , там доп. проект есть проверяющий dll в самом C# Буду очень благодарен за помощь
#41 by Ион
поднимем
#42 by Ион
Еще поднимем , чтобы нужные люди увидели...
#43 by Ион
вверх
#44 by Ион
повыше
#45 by Rie
Посмотрел проект. Где реализации интерфейсов внешней компоненты?
#46 by Rie
+ Возможно, это не тот проект выложен?
#47 by Rie
+ И где ты собираешься использовать эту dll? В v8 или в v7? И что, предположительно, она будет делать? (В v8 возможно использовать ActiveX. Если не требуется "обратное" обращение к 1С, то имеет ли смысл городить огород со внешними компонентами?)
#48 by Sadovnikov
Справедливости ради. Семерка тоже прекрасно работает с ActiveX-и
#49 by Rie
События вроде бы не ловит?
#50 by Sadovnikov
Ловит. Нормально там все...
#51 by Ион
В файле UserControl1.cs все реализации , тот код , что приведен в . Эту dll конкретно я нигде не собираюсь использовать - это тест , а так под V8. Хочется просто иметь шаблон работающего кода для C# , в котором просто есть обращение к свойству/полю/методу. Спасибо
#52 by Ион
Реализации у меня правильные ? (в файле UserControl1.cs , правой кнопкой по элементу, View code -  и там все основное лежит)
#53 by Ион
(45,Алл) где же у меня ошибка ?
#54 by Ион
(АЛЛ) Может кто-нибудь выложить  реально работающий проект на C# с одним свойством/полем/методом , к которому можно обратиться из 1сv8 ?
#55 by Ион
---
#56 by Ион
+
#57 by Rie
Выложить готовый - не вижу смысла. Ты уже использовал готовые - но они не работали, так ведь? Попытайся лучше создать свою внешнюю компоненту "с нуля". Чтобы понять - что и как делается. Не используй UserControl - чтобы не думать, а как же будет этот UserControl взаимодействовать с 1С. Начни с пустой библиотеки классов, содержащей некоторый класс, который и будет реализовывать объект внешней компоненты. Включи в эту библиотеку интерфейсы IInitDone, ILanguageExtender (прочие тебе пока что не понадобятся). Убедись, что их Guid - именно такие, какие хочет видеть 1С, и что они будут _видимы в COM_ (атрибут COMVisible - либо у них, либо у сборки в целом). Также сделай видимым для COM объект внешней компоненты (пусть это будет Privet), задай ему ProgId("AddIn.Privet"). На первом этапе пусть Privet реализует только интерфейс IInitDone. Включи в конструкторы объекта и реализацию методов IInitDone выдачу сообщений (что-нибудь вроде System.Windows.Forms.MessageBox("Выполняется Init"); (естественно, в сборку должны быть включены ссылки на System.Windows.Forms и прочие, которые потребуются). Получишь нечто вроде:    public class AddInObj: IInitDone    {        }        public void Init([MarshalAs(UnmanagedType.IDispatch)] object pConnection)        {        }        public void Done        {        }        public void GetInfo([MarshalAs(UnmanagedType.SafeArray,SafeArraySubType=VarEnum.VT_VARIANT)]ref object[] pInfo)        {    } } Регистрируешь эту сборку, используя regasm (обязательно /codebase) - и создаёшь в 1С объект внешней компоненты, используя ПодключитьВнешнююКомпоненту. Теперь - либо объект создался (и ты получил кучу "Hello!"), либо что-то не срослось. В случае неудачи - получишь сообщения об ошибке. Сообщи, какие именно - и ответить тебе будет легче. Если же всё сработало - пойдём дальше.
#58 by los_hooliganos
оставлю закладку)
#60 by los_hooliganos
сейчас нет времени почитать и понять, но интересно. в выходные хочу поразбираться что ты написал, ибо создание внешних компонент тоже интересно. А тему быстро найти поможет: "темы с моим участием".
#61 by Ион
УРА !!! ЗАРАБОТАЛО !!! Rie , спасибо тебе большое за терпеливые разъяснения - не хватало у меня правильной регистрациии , не хватало  /codebase , а так весь код 1с и C# в и  рабочий ( еще в мне про регистрацию писали , но я думал из прочитанных материалов , что можно вроде и так регистрировать :   - но так ничего не дает (так я зарегистрировал в начале - нашел в какой-то статье), но в GAC dll находиться оказывается не обязательно, чтобы 1с могла эту dll "увидеть") . ========================================================================= Вообщем , вот , может кому пригодится ,  правильный вариант регистрации (в bat  файл поместить след. две строки): RegAsm.exe WindowsControlLibrary1.dll /codebase /tlb: WindowsControlLibrary1.tlb @pause (и только так ! по другому не работает , несмотря на то, что пишут в разных статьях) на экране должно появиться что-то типа вот такого: C:Program Files1cv81in>RegAsm.exe WindowsControlLibrary1.dll /codebase /tlb: WindowsControlLibrary1.tlb Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.42 Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved. Types registered successfully Assembly exported to 'C:Program Files1cv81inWindowsControlLibrary1.tlb', an d the type library was registered successfully Press any key to continue . . . ======================== И насколько я понял , можно dll даже не подписывать - при регистрации RegAsm немножко поругается , но все равно зарегистрирует. Вот что примерно будет на экране: C:Program Files1cv81in>RegAsm.exe WindowsControlLibrary1.dll /codebase /tlb: WindowsControlLibrary1.tlb Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.42 Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved. RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can ca use your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it. Types registered successfully Assembly exported to 'C:Program Files1cv81inWindowsControlLibrary1.tlb', an d the type library was registered successfully Press any key to continue . . . ----------------- но все равно будет работать и в этом случае. И еще . Не обязательно "определить ресурс с номером 100 как имя объекта внешней компоненты." (как написано в - и так все работает без этого ресурса) Еще раз спасибо всем большое, особенно Rie
#62 by Ион
Да , еще что заметил. При правильной регистрации , если все нормально , то в реестре обязательно по ProgID можно найти в реестре ваши классы , которые есть в dll. Когда я регистрировал вот таким способом : @RegAsm.exe /tlb WindowsControlLibrary1.dll @gacutil.exe /i WindowsControlLibrary1.dll - то классов не видел , это породило некие подозрения , что дело возможно в регистрации.
#63 by Topol-M
ну а я про что и писал :) даже с примером привёл.. ух :)
#64 by Ион
Спасибо тебе , я упомянул в , что в уже было написано об этом. Но после того , как я написал , как я зарегистрировал - ты ничего не написал более, я и подумал , что так тоже можно 8=) Еще раз спасибо ;)
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С