Использование .NET сборок в 1С 8.2, 8.3 без установки и без регистрации в реестре

16.12.22

Разработка - Разработка внешних компонент

Для использования .NET сборок в 1С обычно приходится их регистрировать как com-объекты, что не всегда удобно. Предлагаемая компонента выполнена по технологии Native API и дает возможность использовать такие компоненты без установки и без регистрации в реестре windows.

Скачать файлы

Наименование Файл Версия Размер
NETLoader.zip
.zip 2,07Mb
229
.zip 2 2,07Mb 229 Скачать

Предлагаемая компонента выполнена по технологии Native API и дает возможность использовать компоненты, созданные на платформе .NET, без установки и без регистрации в реестре windows. Для подключения .NET сборок используется "CLR Hosting API". При загрузке .NET сборки, компонента начинает обладать свойствами и методами созданного класса.
Ограничения компоненты:

Статические классы не поддерживаются;
Конструктор должен быть без параметров;
Поддерживаются только следующие типы для обмена с 1С: System.String; System.Boolean; System.Int32; System.Double; System.Byte[];
Out и ref параметры не поддерживаются в связи с тем, что не получилось это реализовать, см. описание метода, если кто разберется, как это сделать, буду очень рад.

 

Свойства и метода компоненты:

свойства:

  • CurrentVersionCLR - только для чтения, доступно только после успешного выполнения метода CreateObject(), возвращает используемую версию CLR;

методы:

  • GetLastError() - возвращает строку, содержащую последнюю ошибку;
  • GetInstalledRuntimes() - возвращает строку, содержащую перечисленные через ";" установленные версии CLR;
  • CreateObject(Dir, AssemblyName, ClassName, VersionCLR, RemoveDir) - создает объект из сборки, находящейся в определенном каталоге;
    • Dir - каталог, в котором находятся компоненты, фактически аналог каталога приложения, нужен чтобы могли загрузиться зависимые сборки;
    • AssemblyName - имя сборки без расширения;
    • ClassName - полное имя класса;
    • VersionCLR - необязательный параметр, если не указана, то будет использована последняя версия, формат строки можно посмотреть в свойстве CurrentVersionCLR;
    • RemoveDir - необязательный параметр, по умолчанию Ложь, если Истина, то при уничтожении компоненты будет удален каталог Dir.
  • CreateObjectFromFile(FileName, ClassName, VersionCLR) - создает объект из сборки, находящейся в определенном файле;
    • FileName - полное имя файла;
    • ClassName - полное имя класса;
    • VersionCLR - необязательный параметр, если не указана, то будет использована последняя версия, формат строки можно посмотреть в свойстве CurrentVersionCLR;
  • CreateObjectFromBase64(FileData, ClassName, VersionCLR) - создает объект из сборки, файл которой закодирован в строку Base64.
    • FileData - строка, двоичные данные сборки, закодированные в Base64;
    • ClassName - полное имя класса;
    • VersionCLR - необязательный параметр, если не указана, то будет использована последняя версия, формат строки можно посмотреть в свойстве CurrentVersionCLR;

 

Пример кода:

	Если Не ПодключитьВнешнююКомпоненту(ИмяМакетаКомпоненты, "NET") Тогда
		Сообщить("Не удалось подключить компоненту NETLoader");
		Возврат Неопределено;
	Иначе
		Сообщить("Компонента NETLoader успешно подключена");
	КонецЕсли;
	
	Компонента = Новый("AddIn.NET.NETLoader");
	
	Попытка	
		// Параметры: FileData, ClassName, VersionCLR
		Компонента.CreateObjectFromBase64(Base64Строка(Test_dll), "Test.Class1");
	Исключение
		Сообщить("Ошибка при вызове метода ""CreateObject"": " + ОписаниеОшибкиКомпоненты(Компонента));		
		Компонента = Неопределено;
	КонецПопытки;


	CurrentVersionCLR = Компонента.CurrentVersionCLR;
	Сообщить("CurrentVersionCLR: """ + CurrentVersionCLR + """");
	
	InstalledRuntimes = Компонента.GetInstalledRuntimes();
	Сообщить("Installed runtimes: " + InstalledRuntimes);
	
	Результат = Компонента.TestMethod("СтрокаИз1С");
	Сообщить(Результат);
	
	Компонента.TestProp = "TestPropFrom1C";
	Сообщить(Компонента.TestProp);
	
	Компонента.TestField = "TestFieldFrom1C";
	Сообщить(Компонента.TestField);

 

Описание файлов:

NETLoader.zip - архив, содержащий каталоги:
  • NETLoader - проект для Visual Studio Express 2013 for Windows Desktop и демо обработку (1 версия от 02.09.2014).
  • NETLoader2 - проект для Visual Studio 2015 Community Edition, использованы заголовочные файлы для версии 1С 8.3.8 (2 версия от 14.08.2016).

Отказ от ответственности:

Данный продукт Вы используете на свой страх и риск, претензии ни в каком виде не принимаются.

Update 14.08.2016: проект скомпилирован Visual Studio 2015 Community Edition, использованы заголовочные файлы от 8.3.8, исправлены ошибки и недочеты, добавлены методы CreateObjectFromFile и CreateObjectFromBase64.

Update 13.12.2022: Компонента морально устарела, т.к. давно уже появился .net core, который теперь просто .net, и вообще на серверах уже linux.
Я даже не знаю, работает ли она до сих пор. Поэтому, у меня нет никакого желания получать за нее стартмани, но бесплатной у меня не получилось её сделать.
Если вам нужна какая-то функциональность, которой нет в 1С, то для начала, самый простой способ получить её - это реализовать http-сервис, который можно использовать из 1С.
Ну и если вы уверены, что вам нужна именно нативная внешняя компонента, и не хочется писать её на C++, то попробуйте Rust, тут можно посмотреть пример https://github.com/medigor/example-native-api-rs.

.NET Framework c# CLR Hosting NativeAPI

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52098    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26242    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44974    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35075    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    53997    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30839    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4037    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4774    starik-2005    32    

39
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. OldthiefXXX 153 03.09.14 11:41 Сейчас в теме
Соответственно могу использовать функции и процедуры любой библиотеки DLL написанной на NET, я правильно понял?
2. I_G_O_R 69 03.09.14 13:48 Сейчас в теме
(1) OldthiefXXX, да, требований никаких нет, есть только ограничения(описаны в публикации), главное - это ограничение типов, например объект из компоненты вернуть нельзя(ограничение технологии Native API).
72. pvlunegov 157 03.11.17 13:29 Сейчас в теме
(1) Спасибо большое за обработку.
Удалось создать тестовый проект со сборкой dll на IDE SharpDevelop c .Net 4. Взял текст вашего класса, создал x64 dll, загрузил в макет обработки 1с.
Запустил в 1с, dll запустилась, отработала.
Пара моментов на данный момент не работают:
1. Запуск dll в контексте клиента не отрабатывает, работает только контекст сервера.
С аналогичной проблемой уже сталкивались люди, см. ввыше комментарии.
2. Запуск обработки с управляемой формой возможен либо в управляемом режиме 1с, либо в неуправляемом с созданием неуправляемой формы и переносом функционала в нее.
Это проблема платформы.
Официально, это новая фишка 1с платформы.
На самом деле - баг, который с 2014 года не исправляют.
73. I_G_O_R 69 03.11.17 20:44 Сейчас в теме
(72) Мне лично для веб-клиента она не нужна была, да и кажется это неправильно. Используйте лучше тонкого клиента.
3. killingspree_pro 17.07.15 13:39 Сейчас в теме
Спасибо за компоненту, но при использовании появилось несколько вопросов.

Объясните пожалуйста более подробно, каким образом мы загружаем dll"ку на C#. Из кода демки внешней обработки понятно, что zip архив с манифестом и dll'ка C++ NETLoader_x32.dll загружаются в макет формы. Дальше, при инициализации компоненты в самой базе они загружаются.
Не понятно каким образом Test.dll с кодом C# попадает в обработку.

В коде формы есть строки:
КаталогКомпонент = КаталогВременныхФайлов() + Новый УникальныйИдентификатор;

СоздатьКаталог(КаталогКомпонент);
Test_dll.Записать(КаталогКомпонент + "\Test.dll");

откуда "вытаскивается" Test.dll?
4. I_G_O_R 69 17.07.15 17:18 Сейчас в теме
(3) процедуру ПриСозданииНаСервере() посмотрите, она вытаскивается из макета.
5. killingspree_pro 17.07.15 17:54 Сейчас в теме
(4) I_G_O_R,
Я правильно понял, что Test.dll загружается в макет Test_dll? Если да, то в каком формате?
6. I_G_O_R 69 17.07.15 21:43 Сейчас в теме
(5) Да, загружается как двоичные данные, в том виде, в каком создала её visual studio.
7. Serginio 938 11.05.16 17:24 Сейчас в теме
Кстати, а не пробовал .Net объекты оборачивать через ВК объект как у Elisy
Или методы CLR Hosting API принимают только простые аргументы
8. I_G_O_R 69 11.05.16 21:39 Сейчас в теме
(7) Не очень понял, о чем речь. Если я не ошибаюсь, у Elisy компонента представляет собой полноценный com-объект, соответственно можно обмениваться кроме простых типов также объектами. А технология NativeAPI позволяет передавать только простые типы (число, строка, булево, дата, массив байтов).

Если есть возможность использовать com-объект, то наверное стоит использовать его, т.к. он удобнее в использовании. NativeAPI удобнее только в распространении, т.к. не надо ничего регистрировать. Собственно для этого я и сделал её, потому что бывает, что нет возможности развернуть нужное ПО на компьютерах клиента.
9. Serginio 938 12.05.16 12:22 Сейчас в теме
Я про то, что объект можно обернуть нетовский класс объект в наследнике IComponentBase.
То есть по аналогии с моей компонентой

  public static object ОбернутьОбъект(object obj)
        {
            if (obj != null)
            {
                //switch (obj.GetType().ToString())
                //{
                //    case "System.String":
                //    case "System.DateTime":
                //    case "System.Boolean":
                //    case "System.Byte":
                //    case "System.Char":
                //    case "System.Decimal":
                //    case "System.Double":
                //    case "System.Single": // Float                
                //    case "System.Int32":
                //    case "System.Int64": // Long
                //    case "System.SByte":
                //    case "System.Int16":// Short
                //    case "System.UInt32":
                //    case "System.UInt64":
                //    case "System.UInt16":
                //        break; // These Types do not get wrapped
                //    default:
                //        obj = new AutoWrap(obj); // Wrap Type
                //        break;
                //}
                // Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double и Single.



                Type Тип = obj.GetType();

                if (Тип==typeof(System.IntPtr) || Тип==typeof(System.UIntPtr))
                    return new AutoWrap(obj);

                if (ЭтоСемерка)
                {
                  
                    if (Тип == typeof(System.Decimal)) return ((Decimal)obj).ToString(CultureInfo.InvariantCulture);
                    if (Тип.IsPrimitive)
                    {
                        if ((Тип == typeof(System.Int64) || Тип == typeof(System.UInt32) || Тип == typeof(System.UInt64) || Тип == typeof(System.UInt16) || Тип == typeof(System.SByte)))
                            obj = Convert.ChangeType(obj, typeof(string), CultureInfo.InvariantCulture);
                    }
                    else if (!(Тип == typeof(System.DateTime)
                               || Тип == typeof(System.String)
                               || Тип == typeof(System.Decimal)
                               || Тип.IsCOMObject)
                             )
                        obj = new AutoWrap(obj);
                }
                else
                {
                    if (Тип.IsArray)
                    {
                        Type ТипМассива = Тип.GetElementType();
                        if (ТипМассива != null)
                            Тип = ТипМассива;
                    }

                    if (!(Тип.IsPrimitive
                    || Тип == typeof(System.Decimal)
                    || Тип == typeof(System.DateTime)
                    || Тип == typeof(System.String)
                    || Тип.IsCOMObject)
                          )
                        obj = new AutoWrap(obj);
                }
            }
            return obj;
        }
Показать


Кстати сейчас ПМ можно применять https://habrahabr.ru/post/280978/
12. I_G_O_R 69 13.05.16 23:15 Сейчас в теме
(9) похоже я не в теме, ничего не понимаю. Зачем нужно компоненту оборачивать, что это нам даст?

(10) куда передать? и откуда вернуть? если речь про обмен между компонентой и 1С, то возможна передача только простых типов и массива байтов, таковы ограничения технологии NativeAPI.

(11) пробовал я ByRef, не работает. Я знаю как по-другому сделать, но мне лень свои наработки выкладывать, тем более компонента не очень популярна.
10. Serginio 938 13.05.16 07:37 Сейчас в теме
Можно ли передать ссылку на ВК в качестве параметра. Если да то какой тип Варианта передается, и можно ли такой тип вернуть передав созданный наследник IComponentBase
11. Serginio 938 13.05.16 12:39 Сейчас в теме
Что касается Out и Ref то в COM ты должен указать тип ByRef и передать адрес переменной.

 Args[j-i].vt:=VT_BYREF  or TvarData(p^[i]).VType;
       Args[j-i].unkVal:=@TVarData(p^[i]).VAny;


Получив данные о параметрах через GetParameters можно передавать адрес переменной
13. Serginio 938 14.05.16 00:30 Сейчас в теме
Что бы обернуть реальный объект который например возвращает функция и через ВК выполнять его методы и свойства.
То есть вернуть ссылку и передать не получится? Или ссылку на ВК можно передать?

Тогда можно оборачивать например в двоичные данные структуру типа Variant, а из них доставать уже ссылки на объекты.
А ВК создавать через Новый куда передавать эти двоичные данные для инициализации ВК,
и если нужен объект в параметрах то передавать опять же эти ДД и из неё вытаскивать ссылку на реальный объект.
18. I_G_O_R 69 14.05.16 13:25 Сейчас в теме
(13) это всё извращение (имхо), проще использовать обычный com-объект, написаный на c#. Я к компонентам вообще отношусь так: если можно сделать без компоненты, то лучше так и сделать, потому что потом кто это будет поддерживать?

(14) пробовал я c++/cli, CLR Hosting работает надежнее, сами 1Сники писали, что в таких смешанных сборках есть проблемы (не помню какие). Насчет CLR Hosting могу сказать, что её даже в MS SQL применяют для создания хранимых процедур CLR.

(15) импортозамещение в ПО достаточно условное, сам Linux пишут в америке в основном (если не ошибаюсь), поэтому под этими громкими словами скрывается простой смысл - не платить американцам за ПО. Core CLR еще не достаточно стабилен (судя по отзывам в инете). Тема конечно интересна, тем более xamarin Теперь бесплатный, можно писать на c# под разные платформы.


P.S. я не проф. разработчик на технологиях .NET, поэтому к моему мнению нужно относится с осторожностью.
19. Serginio 938 14.05.16 14:45 Сейчас в теме
(18) На самом деле проще использовать класс .Net COM через обертку. В том числе с динамической компиляцией обертки для событий.
Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

Просто данный подход можно прикрутить к ВК Native.

Кстати а CLR Hosting используется в .Net Core ?
23. I_G_O_R 69 14.05.16 16:18 Сейчас в теме
(19) вот нашел даже лучше:
https://github.com/Marqin/simpleCoreCLRHost
This C++ app allows to run custom C# method from compiled C# .dll on Linux and OS X using coreCLR
21. I_G_O_R 69 14.05.16 16:09 Сейчас в теме
(18) посмотрю на досуге

что-то точно есть, вот тут https://habrahabr.ru/post/273509/ есть какие-то намеки на это

22. I_G_O_R 69 14.05.16 16:15 Сейчас в теме
14. Serginio 938 14.05.16 01:15 Сейчас в теме
Например можно используя http://pragmateek.com/using-c-from-native-c-with-the-help-of-ccli-v2/

На стороне .Net выполнять метод. Параметры передаются ввиде Stream. Сначало идет тип, затем данные. Возвращаемые объекты сохряняются в словаре и ID типа автоинкремента и передается тип как ссылочный и ИД.
В 1С мы можем возвращать Двоичные данные. Единственно, что byte[] мы тоже должны упаковывать и распаковывать
15. Serginio 938 14.05.16 08:12 Сейчас в теме
Объекты можно зранить в List
struct Элемент
{
 Object объект;
 int СледующийУдаленныйЭлемент
}

 Class МенеджерПамяти
  { List<Элемент> Список;
   int ПервыйУдаленный;
}
Показать


Я это к тому, что можно и в Linux это сделать с Core .Net
Сейчас с импортозамещением это будет актуально
16. Serginio 938 14.05.16 08:38 Сейчас в теме
20. Serginio 938 14.05.16 15:48 Сейчас в теме
Я начал использовать обертку, когда пришлось прикручивать Вэб сервис неподдерживаемый 1С.
А там была куча классов. И стал выбор либо вручную использовать обертку либо реализовать встроенный механизм IReflect.
Для примера в .Net в 1С. На примере использования HTTPClient,AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция

AngleSharp используется под сотню классов и интерфейсов. Кстати если раньше сначала писал на C# и переводил на 1С, то сейчас уже пишу напрямую. Опыт
24. Serginio 938 14.05.16 20:04 Сейчас в теме
Во спасибо огромное. Кстати исходники здесь
25. Serginio 938 02.06.16 14:40 Сейчас в теме
А не подскажешь как побороть ошибку при компиляции в VS 2015
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2371 int8_t: переопределение; различные базовые типы NETLoader \netloader\addin.netloader\include\types.h 67

А то я начинающий С++ ник
26. I_G_O_R 69 02.06.16 21:55 Сейчас в теме
(25) думаешь я профи что ли?))
походу где-то уже объявлен такой тип
https://msdn.microsoft.com/ru-ru/library/t6xy3ys5%28v=vs.90%29.aspx

вообще советую обновить все файлы из каталога include, т.к. с тех пор много чего изменилось, в компоненты была добавлена асинхронность, вроде бы шаблон собрали не 2010 студии, а на 2013.
28. cool.vlad4 2 02.06.16 23:01 Сейчас в теме
(25) Serginio, как уже правильно заметили, тип такой определен. посмотри заголовчные файлы. у микрософта такой в заголовчнике есть, и скорее всего в заголовке у 1С в ВК. самое простое решение , это добавить к 1С typedef , signed.
(С++ не тот язык , который наскоком учится. в отличие от C#. советую почитать какие-нибудь книги. ошибки так и будут возникть, важно понимать причины их появления )
и советую установить английскую версию VS. просто потому что информацию по ошибкам будет проще искать.
29. Serginio 938 03.06.16 10:15 Сейчас в теме
(28) Ну С# тоже не наскоком. Там своих прибамбасов куча. А C++ просто отличается и куча нюансов. Сейчас в метро читаю. Занимательная штука. Время летит незаметно.
Кстати а есть полный аналог MemoryStream d C++. Или проще свой написать там недолго.
А насчет английской версии VS я уже понял. Идут кракозябры
27. Serginio 938 02.06.16 22:33 Сейчас в теме
30. Serginio 938 03.06.16 12:50 Сейчас в теме
Нашел в новом types.h
typedef signed char int8_t ;
//typedef __int8 int8_t ; ///< 8-bit integer
31. killingspree_pro 06.06.16 17:09 Сейчас в теме
Спасибо за обработку, успешно пользуемся уже почти год. Но, недавно столкнулись с одной очень странной проблемой. У клиента Windows server 2008, 1C Клиент-Сервер, база на SQL. На windows есть две учетки - Администратора системы и специальная учетка для службы 1С Агент(имя starter1C). Соответственно, на самом сервере мы можем работать с 1С под обеими учетками(просто указываем, где запускается обработка - на клиенте или на сервере), в то время как пользователи на удаленных машинах работают только под пользователем starter1C. В общем, если мы работает под администратором системы, все работает корректно, если под пользователем starter1C, то обработка крашится на функции CreateObject().
В чем причина так и не удалось понять, оба пользователя администраторы системы, по идее вся разница только в используемых Temp папках - C:\Users\<имя пользоваетля>\AppData\Local\Temp.

Помогите пожалуйста, было бы здорово разобраться с этим странным явлением:)
32. I_G_O_R 69 06.06.16 22:18 Сейчас в теме
(31) Если под администратором работает, а под урезанной учеткой нет, то подозрение на права, наверное на каталог, который передается первым параметром в метод CreateObject

я давно еще добавил метод CreateObjectFromBase64(), в этом методе не используется каталог, а передается dll в виде строки (кодированной Base64), потом конвертируется в массив байтов и загружается в домен. Но есть небольшой минус - если есть зависимые dll, то их нужно зашивать в ресурсы (в случае загрузки из каталога CLR сама их загрузит). Приме во вложении.
Прикрепленные файлы:
NETLoader.zip
33. killingspree_pro 07.06.16 12:05 Сейчас в теме
(32) I_G_O_R, Спасибо, попробуем!
59. killingspree_pro 15.12.16 17:37 Сейчас в теме
Версия 1С 8.3.9.1850, либо 8.3.8.2027. Версию компоненты использовал из (32) ответа.
61. I_G_O_R 69 18.12.16 00:52 Сейчас в теме
(59) там еще старые заголовочные файлы, попробуйте компоненту из вложения
Прикрепленные файлы:
NETLoader.zip
64. killingspree_pro 19.12.16 13:58 Сейчас в теме
(61) К сожалению, без изменений. Все также работает только первый метод - из каталога, два остальных метода на клиенте не работают... В общем-то не страшно, мы просто используем оба в зависимости от успешности его выполнения:)
34. killingspree_pro 15.06.16 13:49 Сейчас в теме
Еще раз большое спасибо, все заработало, хотя и с некоторыми ограничениями. Компонента без зависимых dll подключилась нормально, в то время как состоящую из нескольких dll подключить так и не удалось. Не помогло даже сшивание их в единую dll с помощью программы ilMerge. Причем такое же ограничение возникло и при использовании второго метода загрузки - из временного файла.
35. Serginio 938 15.06.16 21:11 Сейчас в теме
(34) Все зависимые Dll должны быть в одной папке. Иногда даже требуется, что бы было все в директории 1С.
Если, что попробуй Как вызвать метод из C# в 1С?
36. I_G_O_R 69 16.06.16 00:04 Сейчас в теме
(34) для обоих методов нужно использовать событие AssemblyResolve объекта AppDomain, смотри пример в проекте Test:
в ресурсы dll добавлена другая сборка System.Web.Helpers.dll, она загружается в домен в методе CurrentDomain_AssemblyResolve, а этот метод в свою очередь является обработчиком события AssemblyResolve.

вот тут https://msdn.microsoft.com/ru-ru/library/ff527268(v=vs.110).aspx описано что происходит.
37. killingspree_pro 30.06.16 13:17 Сейчас в теме
(36) I_G_O_R, хорошо попробуем так. А не знаете, почему не помогло сшивание всех сборок в единую dll?
38. I_G_O_R 69 30.06.16 22:19 Сейчас в теме
(37) Нет, не знаю, про этот инструмент впервые от Вас услышал.
39. Serginio 938 05.07.16 10:09 Сейчас в теме
40. I_G_O_R 69 05.07.16 20:43 Сейчас в теме
(39) Спасибо! Я видел Вашу статью на хабре, я пока с линуксом не работаю, для меня это не актуально. NativeAPI хорош тем, что не надо ничего больше устанавливать, .NET Framework уже установлен на windows, и поэтому им уже сейчас можно пользоваться, а CoreCLR нужно устанавливать.
41. Serginio 938 05.07.16 21:43 Сейчас в теме
(40) CoreCLR всего 65 мегабайт. Я их кстати вместе с исходниками закинул, что бы не мучится с установкой.
42. killingspree_pro 03.08.16 11:28 Сейчас в теме
Все заработало, действительно способ с использованием AssemblyResolve работает. Вот здесь еще интересная статья на эту тему http://www.codeproject.com/Articles/528178/Load-DLL-From-Embedded-Resource
43. пользователь 15.08.16 11:14
(0) I_G_O_R, не хочет ли автор закинуть исходники на GitHub? =)
44. I_G_O_R 69 15.08.16 20:32 Сейчас в теме
(43) а зачем мне это нужно?)) Денег это не приносит, известность тоже, публикация судя по звездам популярностью не пользуется.
Вообще те методы давно добавлены, просто лень было обновлять публикацию, вот решил обновить не знаю зачем. Вообще у меня есть еще наработки, но т.к. требуется время, чтобы всё это оформить и выложить, а пользы не предвидится, то и не хочется этим заниматься.
53. pbazeliuk 1955 20.11.16 23:29 Сейчас в теме
(44) I_G_O_R, Добрый день, использую ваш код и вот хочу выложить на github компоненту работы с RabbitMQ (C#) с NetLoader по лицензией LGPL 3.0. Если вы не против, добавлю вас как автора к исходным кодам NETLoader.
55. I_G_O_R 69 21.11.16 00:39 Сейчас в теме
(53) Я не против. Только я не понял, в NETLoader какая лицензия будет указана?
56. pbazeliuk 1955 21.11.16 09:30 Сейчас в теме
(55) I_G_O_R, Отписал в личные сообщения.
57. killingspree_pro 15.12.16 16:15 Сейчас в теме
(55)Добрый день!
Не думал, что придется писать вам, так как до недавнего времени компонента работала корректно.Но, внезапно выяснилось, что на некоторых машинах компонента не работает, если ее запускать в контексте клиента.
Сама компонента NETLoader загружается, но при вызове метода CreateObjectFromBase64 возникает исключение, также поле CurrentVersionCLR не доступно. При этом, если запускать в контексте сервера, все нормально.
Как ни странно, функция GetInstalledRuntimes() работает нормально везде.
Пытался, как-то отследить зависимость ошибки, но на двух разных машинах с одинаковой ос (windows server 2008) и версией платформы, ошибка проявляется только на одной машине.
При этом, если использовать метод загрузки из временной папки CreateObject, то все нормально.
Не знаю будете ли вы разбираться с этим, но просто сообщил о такой ситуации.
pvlunegov; +1 Ответить
45. TeMochkiN 03.09.16 19:43 Сейчас в теме
Здравствуйте!
А с помощью вашей компоненты можно вызывать внешние события в 1С?
48. RainyAugust22 265 27.09.16 15:35 Сейчас в теме
Автор, выручай плз, подскажи как выкрутиться.
ps.метод в моей компоненте возвращает 1С'ке многомерный массив "multidimensional array <double>" .
На этом моменте 1С ругается на ошибку, так понимаю что с многомерными массивами Netloader не работает.
49. I_G_O_R 69 27.09.16 16:15 Сейчас в теме
(48) не работает, потому что сама технология NativeAPI подразумевает обмен только простыми типами.
Нужно вернуть простой тип, например сериализовать массив в строку используя формат XML, JSON, CSV и т.д.
А в 1С потом можно десериализовать одним из встроенных методов.
Я делал лично так: в 1С создаешь нужный объект (в данном случае массив), сериализовал его с помощью объекта СериализаторXDTO, посмотрел какой получился текст, в компоненте в лоб сделал такой же текст (используя StringBuilder) и вернул получившуюся строку. в 1С потом с помощью объекта СериализаторXDTO обратно десериализовал.

процедуры для сериализации/десериализации:

Функция СериализоватьВXML(Значение)
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
	СтрокаXML = ЗаписьXML.Закрыть();
	
	Возврат СтрокаXML;
	
КонецФункции

Функция ДесериализацияИзXML(СтрокаXML)
	
	ЧтениеXML = Новый ЧтениеXML();
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
	ЧтениеXML.Закрыть();
	
	Возврат Значение;
	
КонецФункции
Показать
RainyAugust22; +1 Ответить
50. RainyAugust22 265 29.09.16 07:13 Сейчас в теме
(49) I_G_O_R, спасибо. Попробую сериализацию, пока для тестов ограничился созданием паблик массива и методом из 1С'ки который в цикле, заполняет массив компоненты и получает из него данные.
А как считаете правильнее/быстрее?
Ведь в случае с сериализацией: на стороне 1с надосериализовать начальные данные(массив) в строку, затем строку опять сериализовать на стороне компоненты в массив c#. И обработанные данные также возвращать 1С т.е снова сериализовывать на компоненте передать 1с и сериазовать в тип 1с.

В случае обьявления в компоненте доступных массивов: Входящие данные и Результирующие данные и метода для установки/получения данных массива по индексу из 1С.
Множественные вызовы компоненты из 1С для получения значений, но не быстрее ли так чем с сериализацией или какие подводные камни могут быть.
51. I_G_O_R 69 29.09.16 08:08 Сейчас в теме
(50) честно не знаю, тестировать надо, если мало данных, то я думаю, что это непринципиально, сделайте как удобнее. Вызов метода компоненты тоже не очень быстрый, т.к. там несколько прослоек.
52. Serginio 938 29.09.16 10:32 Сейчас в теме
(50) Попробуй другие варианты
Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент

или кроссплатформенный вариант, но неудобный в применении
Например

1С, Linux, Excel, Word, OpenXML, ADO, Net Core
54. pbazeliuk 1955 20.11.16 23:33 Сейчас в теме
(50) RainyAugust22, стабильно работает с большими объемами данных, конечно если достаточно памяти на сервере 1С.
58. I_G_O_R 69 15.12.16 16:49 Сейчас в теме
Спасибо что сообщили. Но, честно говоря, даже не знаю в какую сторону копать...

Хотя возможно дело в том, что когда добавили асинхронность в 1С, в компоненте тоже что-то поменялось. В версии 8.3.8 был обновлен шаблон компоненты для поддержки асинхронности и я тоже выложил перекомпилированную компоненту. Вы используете последнюю версию? Версия 1С какая (8.3.7, 8.3.8)?
60. killingspree_pro 16.12.16 18:39 Сейчас в теме
(58) Хотелось бы узнать у вас по поводу асинхронности.
Допустим, у меня во внешней компоненте будут выполняться долгие по времени вычисления. В данном случае, можно ли воспользоваться асинхронным вызовом ВК, чтобы интерфейс у пользователя не замораживался?
62. I_G_O_R 69 18.12.16 01:03 Сейчас в теме
(60) В платформе 1С асинхронность поддерживается только на клиенте, и то формально, по факту интерфейс блокируется (8.3.9 я не проверял еще).
Чтобы не блокировался интерфейс, придется реализовывать что-то подобное: в компоненте запускать другой поток и в нем выполнять все действия. А чтобы понять, что действие выполнено, придется периодически опрашивать компоненту (т.к. поддержка внешних событий в текущей версии компоненты отсутствует). Т.е. вместо одного метода придется делать два: один запускает выполнение в другом потоке, второй проверяет выполнение и если надо возвращает результат.
65. killingspree_pro 19.12.16 13:59 Сейчас в теме
(62)
(63)
Спасибо за ответ. В общем-то мы таки делаем, вызываем метод в новом потоке и потом проверяем результат с определенным интервалом.
63. Serginio 938 18.12.16 11:23 Сейчас в теме
66. protsent 21.12.16 15:43 Сейчас в теме
вы все правильно делаете
67. KroVladS 34 28.03.17 11:30 Сейчас в теме
(0)
Запустить эту компоненту в браузере(веб-клиенте) никак нельзя как я понял?
68. I_G_O_R 69 28.03.17 21:12 Сейчас в теме
(67) все правильно понял, нельзя.
69. KroVladS 34 29.03.17 08:38 Сейчас в теме
(68)
очень жаль.
Вам не известны работающие методы использования C# библиотек в проекте C++?
70. I_G_O_R 69 29.03.17 12:31 Сейчас в теме
(69) сама компонента написана на с++, в ней как раз используется один такой способ, называется Hosting CLR API, исходный код открыт, посмотрите как реализовано.
74. пользователь 07.09.20 11:04
Сообщение было скрыто модератором.
...
Оставьте свое сообщение