Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.06.16 07:52
Оценка: 66 (1)
Здравствуйте, Serginio1, Вы писали:


Ну не прошло и 2 недели. Сделал и для 1С.

Перем   Врап,СсылкаНаДомен;
Функция СоздатьОбъектПоСсылке(Ссылка)
    
    рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
    рез.УстановитьСсылку(СсылкаНаДомен,Ссылка);    
    возврат  рез
КонецФункции // СоздатьОбъектПоСсылке()


Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    СылкаСБ=Врап.Новый("System.Text.StringBuilder","Первая Строка");
    СсылкаCultureInfo=Врап.ПолучитьТип("System.Globalization.CultureInfo");
    
    СсылкаCultureInfoES=Врап.Новый(СсылкаCultureInfo,"es-ES");
    
    // 
    СultureInfo=СоздатьОбъектПоСсылке(СсылкаCultureInfo);
    
    СБ=СоздатьОбъектПоСсылке(СылкаСБ);
    Сообщить(СБ.Capacity);
    Сообщить(СБ.ПолучитьСсылку());
    
    СсылкаInvariantCulture=СultureInfo.InvariantCulture;
    
    // К сожалению 1С вызывает метод имеющий возвращаемое значение как функцию даже если вызов идет как процедура
    //Нужно очистить ссылку в списке объектов
    ссылка=Сб.Append("Новая Строка"); Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine();   Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.Append("Вторая Строка"); Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine();     Врап.ОчиститьСсылку(ссылка);
    
    ссылка=Сб.AppendFormat("AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );   Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);
    
    // Так как в параметрах можно передавать только простые типы закодирум ссылку на объект в строку
    ссылка=Сб.AppendFormat(СсылкаCultureInfoES,"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина );  Врап.ОчиститьСсылку(ссылка);
    ссылка=Сб.AppendLine(); Врап.ОчиститьСсылку(ссылка);
    
    ссылка=Сб.AppendFormat(СсылкаInvariantCulture,"AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина ); 
    Врап.ОчиститьСсылку(СсылкаInvariantCulture);
    
    
    
    
    
    Сообщить(СБ.ToString());
    СБ.Capacity=40;
    Сообщить(СБ.Capacity);
    
    // Очистка ссылок СБ и  СultureInfo осуществляется внутри ВК
КонецПроцедуры

Процедура ПриОткрытии() 
    
    
    ИмяФайла="d:\MyPrograms\VNCOMP83\AddInNetObjectToNative\AddInNetObjectToNative\Debug\AddInNetObjectToNative.dll";
    
    ПодключитьВнешнююКомпоненту(ИмяФайла, "NetObjectToNative",ТипВнешнейКомпоненты.Native); 
    Врап = Новый("AddIn.NetObjectToNative.LoaderCLR");
    CoreClrDir="c:\Program Files\DNX\runtimes\dnx-coreclr-win-x86.1.0.0-rc1-update1\bin\";
    ДиректорияNetObjectToNative="d:\MyPrograms\VNCOMP83\NetObjectToNative\NetObjectToNative\bin\Debug\";
    
    СсылкаНаДомен=Врап.СоздатьОбертку(CoreClrDir,ДиректорияNetObjectToNative,"");
    
КонецПроцедуры


Пока сделал для Win. Допилю еще вызовы методов расширений. Вызов дженериков определяемых по типу.

Но помоему никому это не надо.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.06.2016 8:04 Serginio1 . Предыдущая версия .
Re[2]: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.06.16 09:43
Оценка:
Здравствуйте, Serginio1, Вы писали:
Кстати в первоначальном примере ошибка прокралась

СылкаСБ=Врап.Новый("System.Text.StringBuilder","Первая Строка"); 
//Сообщить(СылкаСБ); 

СсылкаCultureInfo=Врап.ПолучитьТип("System.Globalization.CultureInfo"); 

    СсылкаCultureInfo=Врап.Новый(СсылкаCultureInfo,"es-ES"); 
// Здесь уже СсылкаCultureInfo указывает на объект 

// 
    СultureInfo=СоздатьОбъектПоСсылке(СсылкаCultureInfo); 

И СultureInfo это не тип а объект СсылкаCultureInfo,"es-ES");   

   
// Вызываем статический метод     
    СсылкаInvariantCulture=СultureInfo.InvariantCulture;

он проходит, так как нет проверки на статик.

Я думаю так и оставить. Можно из объекта как в Delphi вызывать и методы объекта и статические
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.06.16 11:18
Оценка:
Здравствуйте, Serginio1, Вы писали:



Столкнулся с такой проблемй.
Если Загрузить в 1с CLR
hr = pfnGetCLRRuntimeHost(IID_ICLRRuntimeHost2, (IUnknown**)&pCLRRuntimeHost);
А затем выгрузить и повторно попробовать загрузить. То получаем недопустимую операцию.


Вторая проблема это то, что можно создать только один домен и его нельзя выгружать.
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.06.16 08:58
Оценка:
Здравствуйте, Serginio1, Вы писали:

Сделал тестовый класс

namespace TestDllForCoreClr
{
    public class Тестовый
    {
        public static string Поле = "Статическое поле";
        public string СвойствоОбъекта { get; set; }

        public  Тестовый(string СвойствоОбъекта)
            {
            this.СвойствоОбъекта = СвойствоОбъекта;
            }

        public string ПолучитьСтроку()
        {

            return "Привет из CoreClr";
        }

        public int ПолучитьЧисло(int число)
        {

            return число;
        }
    }
}



И вызов из С++

//Теперь Создадим эклемпляр класса из сторонней сборки
    paParams->vt = VTYPE_PWSTR;
    paParams->pwstrVal = L"TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";

    auto par2 = paParams;
    par2++;
    par2->vt = VTYPE_PWSTR;
    par2->pwstrVal = L"Свойство из Конструктора";
    res = mD->pCallAsFunc(0, L"Новый", &RetVal, paParams, 2);

    long testRef = GetTarget(&RetVal);
    paParams->vt = VTYPE_I4;
    paParams->lVal = 3;

    res = mD->pCallAsFunc(testRef, L"ПолучитьЧисло", &RetVal, paParams, 1);
    wprintf_s(L"input int : %d\n", RetVal.lVal);


    TestCallMethod(mD, testRef);
    TestCallMethod(mD, testRef);
    TestCallMethod(mD, testRef);




Ну и вызов миллиона нетовской функции

void TestCallMethod(NetObjectToNative::ManagedDomainLoader* mD, long Target)
{
    tVariant Params[4];
    tVariant RetVal;
    tVariant* paParams = Params;
    typedef std::chrono::high_resolution_clock Clock;
    auto start = Clock::now();
    

    long r = 0;
    for (int i = 0; i < 1000000; i++)
    {
        
        paParams->lVal = i;
        paParams->vt = VTYPE_I4;
        mD->pCallAsFunc(Target, L"ПолучитьЧисло", &RetVal, paParams, 1);
        
        r += RetVal.lVal;
        r %= 1 << 30;

    }

    auto finish = Clock::now();


    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(finish - start).count() / 1000000000.0;


    wprintf_s(L"Tme=:  %.2f  second\n", elapsed);
    wprintf_s(L"Eval Value=:  %d \n", r);
}


Получилось около 3 сек 2.8, на моем i3-2120 3.3 GHz

Может я что делаю не так?


// Сначала хотел закодировать ссылку в byte[]
// Но 1С может передавать в параметрах только булево,дату, числа и строки

long GetTarget(tVariant* CurParam)
{
    wchar_t* curstr = CurParam->pwstrVal;
    curstr += 13;
    wstring temp = curstr;
    return stol(temp);

}
и солнце б утром не вставало, когда бы не было меня
Отредактировано 28.06.2016 9:09 Serginio1 . Предыдущая версия .
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.07.16 08:11
Оценка: 2 (1)
Здравствуйте, Serginio1, Вы писали:

Выложил статью Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
Исходники лежат Здесь
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.07.16 10:29
Оценка:
Здравствуйте, Serginio1, Вы писали:

Выложил статью
Разработка → Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
Исходники здесь
и солнце б утром не вставало, когда бы не было меня
Re[10]: Приоритет вызова перегруженных методов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.07.16 11:45
Оценка: 69 (2)
Здравствуйте, Sinix, Вы писали:

Для Динамиков нашел решение
https://gist.github.com/jflam/777574
https://github.com/mgravell/fast-member/blob/master/FastMember/CallSiteCache.cs

На основании сделал для разного рода DynamicObject


using System.Text;
using System.Threading.Tasks;
using System.Linq.Expressions;
using Microsoft.CSharp.RuntimeBinder;
using System.Dynamic;
using System.Runtime.CompilerServices;
namespace Тестовый
{
   public class DynamicInvoker
    {
       public static object InvokeMember(object target, string methodName, params object[] args)
        {
            var targetParam = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
            CSharpArgumentInfo[] parameterFlags = new CSharpArgumentInfo[args.Length + 1];
            System.Linq.Expressions.Expression[] parameters = new System.Linq.Expressions.Expression[args.Length + 1];
            parameterFlags[0] = targetParam;
            parameters[0] = System.Linq.Expressions.Expression.Constant(target);
            for (int i = 0; i < args.Length; i++)
            {
                parameterFlags[i + 1] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null);
                parameters[i + 1] = System.Linq.Expressions.Expression.Constant(args[i]);
            }
            var csb = Binder.InvokeMember(CSharpBinderFlags.None, methodName, null, typeof(DynamicInvoker), parameterFlags);
            var de = DynamicExpression.Dynamic(csb, typeof(object), parameters);
            LambdaExpression expr = System.Linq.Expressions.Expression.Lambda(de);
            return expr.Compile().DynamicInvoke();
        }

        public static object GetValue(object target,string name)
        {
            
            CallSite<Func<CallSite, object, object>> callSite = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, name, typeof(DynamicInvoker), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
               
            return callSite.Target(callSite, target);
        }
        public static void SetValue(object target, string name,  object value)
        {
          
                CallSite<Func<CallSite, object, object, object>> callSite = CallSite<Func<CallSite, object, object, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, name, typeof(DynamicInvoker), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null) }));
                callSite.Target(callSite, target, value);
        }


    }
}



И вызов


void ВывестиСвойство(object target, string ИмяСвойства)
        {
            textBox.AppendText(ИмяСвойства+"="+DynamicInvoker.GetValue(target, ИмяСвойства).ToString() + Environment.NewLine);

        }
        private void button_Click(object sender, RoutedEventArgs e)
        {
            dynamic res = new ExpandoObject();
            res.Имя = "Тест ExpandoObject";
            res.Число = 456;
            res.ВСтроку = (Func<string>)(() => res.Имя);
            res.Сумма = (Func<int,int,int>)((x,y) => x+y);

            textBox.Clear();
            textBox.AppendText("ВСтроку="+DynamicInvoker.InvokeMember(res, "ВСтроку").ToString()+Environment.NewLine);
            textBox.AppendText("Сумма=" + DynamicInvoker.InvokeMember(res, "Сумма", 1, 2).ToString() + Environment.NewLine);

            ВывестиСвойство(res, "Имя");
            ВывестиСвойство(res, "Число");

            DynamicInvoker.SetValue(res, "Имя","Новое Имя");
            DynamicInvoker.SetValue(res, "Число","768");

            ВывестиСвойство(res, "Имя");
            ВывестиСвойство(res, "Число");

        }
и солнце б утром не вставало, когда бы не было меня
Отредактировано 06.07.2016 13:55 Serginio1 . Предыдущая версия .
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.07.16 12:43
Оценка:
Здравствуйте, Serginio1, Вы писали:

Добави вывод типов для дженерик методов
Теперь можно не выводить отдельно метод


// public T ДженерикМетод<V, T>(V param1, T param2, V param3) 
Сообщить(Тест.ДженерикМетод(1,"Привет",3));
//


//public V ДженерикМетод2<K, V>(Dictionary<K, V> param1, K param2, V param3)

Словарь= ъНовый("System.Collections.Generic.Dictionary`2[System.Int32,System.String]");
Сообщить(Тест.ДженерикМетод2(Словарь.ПолучитьСсылку(),3,"Привет2"));

// public K ДженерикМетод3<K>(IList<K> param1, int param2, K param3)

List=ъНовый("System.Collections.Generic.List`1[System.String]");
Сообщить(Тест.ДженерикМетод3(List.ПолучитьСсылку(),3,"Привет3"));
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.07.16 12:21
Оценка:
Здравствуйте, Serginio1, Вы писали:

Сделал поддержку внешнего события
В классе создадим поле типа Action<string, string, string>


public class Тестовый 
    { 
      public Action<string, string, string>   ВнешнееСобытие1С;

// И сделаем эмуляцию события.



public async void TestВнешнегоСобытия() 
        { 
            for(int i=0;i<100; i++)
            {
                var значение = i.ToString();
                Task.Run(async() =>
                {
                   await Task.Delay(1000).ConfigureAwait(false);
                   this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение);
                });

                await Task.Delay(50).ConfigureAwait(false);
            }


        }


В 1С.

Процедура ВнешнееСобытие(Источник, Событие, Данные)
    // Вставить содержимое обработчика.

    
    Сообщить("Источник="+Источник);
    Сообщить("Событие="+Событие);
    Сообщить("Данные="+Данные);
КонецПроцедуры

Процедура ТестВнешнегоСобытияНажатие(Элемент)
    // Вставить содержимое обработчика.

    Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора")); 

Делегат=Ъ(Врап.ПолучитьДелегатВнешнегоСобытия1C());
Тест.ВнешнееСобытие1С=Делегат.ПолучитьСсылку();
Тест.TestВнешнегоСобытия();
КонецПроцедуры


И не забыть в Переменных модуля установить
Перем   Тест;
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.07.16 13:01
Оценка:
Здравствуйте, Serginio1, Вы писали:

Добавил поддержку параметров по умолчанию

Добавил поддержку параметров по умолчанию
// Тест вызова метода с параметрами по умолчанию

//public static int OptionalParam(int x, int y, int z = 5, int s = 4,string str="Привет")
    //       {
    //           return x + y + z + s;
    //       }





Сообщить("OptionalParam(int x, int y)="+Тестовый.OptionalParam(1,2));
    Сообщить("OptionalParam(int x, int y, int z = 5)="+Тестовый.OptionalParam(1,2,3));
    Сообщить("OptionalParam(int x, int y, int z = 5, int s,string str)="+Тестовый.OptionalParam(1,2,3,4,"ХаХа"));


Теперь думаю прикрутить методы расширению.
Можно к каждому типу прикрутить типы реализующих расширения.
Поиск провести по типу и сборкам. Может есть какие то другие решения?
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.08.16 08:39
Оценка:
Здравствуйте, Serginio1, Вы писали:

Прошу совета по блокировкам. Есть такая конструкция для хранения объектов одного типа.

 public struct ЭлементХранилища
    {
        internal AutoWrap Объект;
        internal int Next;


        internal ЭлементХранилища(AutoWrap Объект)
        {

            this.Объект = Объект;
            Next = -1;
        }

        internal ЭлементХранилища(AutoWrap Объект, int next)
        {

            this.Объект = Объект;
            Next = next;
        }
    }

    internal class ХранилищеОбъектов
    {
        const int НачальноеКоличествоЭлементов = 2;
        ЭлементХранилища[] Элементы = new ЭлементХранилища[НачальноеКоличествоЭлементов];
        int КоличествоЭлементов = 0;
        int РазмерМассива = НачальноеКоличествоЭлементов;
        int FirstDeleted = -1;
        static SpinLock sl = new SpinLock();
        public int Add(AutoWrap Объект)
        {



            var элемент = new ЭлементХранилища(Объект);

            var gotLock = false;
            try
            {
                sl.Enter(ref gotLock);


                if (FirstDeleted == -1)
                {
                    
                    return AddInArray(элемент);
                }
                else
                {
                    int newPos = FirstDeleted;
                    FirstDeleted = Элементы[newPos].Next;
                    Элементы[newPos] = элемент;
                    return newPos;

                }
            }
            finally
            {
                 if (gotLock) sl.Exit();
            }

        }

        int AddInArray(ЭлементХранилища Элемент)
        {

               if (КоличествоЭлементов == РазмерМассива)
                {
                    var temp = new ЭлементХранилища[РазмерМассива * 2];
                    Array.Copy(Элементы, 0, temp, 0, Элементы.Length);
                    Элементы = temp;
                    РазмерМассива = Элементы.Length;

                }

                Элементы[КоличествоЭлементов] = Элемент;
                var res = КоличествоЭлементов;
                КоличествоЭлементов++;
                return res;
                   
        }
        public void RemoveKey(int Pos)
        {
            var элементы = Элементы;
            // Первый элемнт никогда не удаляем.
            if (Pos > 0 && Pos < элементы.Length && элементы[Pos].Объект != null)
            {
                var gotLock = false;
                try
                {
                    sl.Enter(ref gotLock);

                    var Элемент = new ЭлементХранилища(null, FirstDeleted);
                    Элементы[Pos] = Элемент;

                    FirstDeleted = Pos;
                }

                finally
                {
                   if (gotLock) sl.Exit();
                }
            }



        }

        public AutoWrap GetValue(int Pos)
        {
        
          // По идее для получения элемента не нужно никаких блокировок
          // Получает текущий массив элеменов
            var элементы = Элементы;
            if (!(Pos > -1 && Pos < элементы.Length && элементы[Pos].Объект != null))
                return null;

            return элементы[Pos].Объект;

        }

    }



Основное изменение массива происходит только при изменении размера массива



if (КоличествоЭлементов == РазмерМассива)
                {
                    var temp = new ЭлементХранилища[РазмерМассива * 2];
                    Array.Copy(Элементы, 0, temp, 0, Элементы.Length);
                    Элементы = temp;
                    РазмерМассива = Элементы.Length;

                }



Доступ к элементам массива по идее можно делать без блокировок



public AutoWrap GetValue(int Pos)
        {
        
          // По идее для получения элемента не нужно никаких блокировок
          // Получает текущий массив элементов
            var элементы = Элементы;
            if (!(Pos > -1 && Pos < элементы.Length && элементы[Pos].Объект != null))
                return null;

            return элементы[Pos].Объект;

        }
и солнце б утром не вставало, когда бы не было меня
Re[2]: .Net Core. Вызов манагед кода из натива
От: vorona  
Дата: 08.08.16 09:30
Оценка:
Здравствуйте, Serginio1, Вы писали:

Запись можно сделать:
Interlocked.CompareExchange(ref Элементы, temp, Элементы);


Чтение:
Interlocked.CompareExchange(ref Элементы, null, null);


РазмерМассива:
int РазмерМассива => Элементы.Length;
Re[3]: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.08.16 09:40
Оценка:
Здравствуйте, vorona, Вы писали:

V>Здравствуйте, Serginio1, Вы писали:


V>Запись можно сделать:

V>
V>Interlocked.CompareExchange(ref Элементы, temp, Элементы);
V>


V>Чтение:

V>
V>Interlocked.CompareExchange(ref Элементы, null, null);
V>


V>РазмерМассива:

V>
V>int РазмерМассива => Элементы.Length;
V>


Спасибо! Тогда SpinLock не нужен? Ладно попозже сделаю.

То есть вместо

 var элементы = Элементы;


Преедпочтительнее


var элементы = Interlocked.CompareExchange(ref Элементы, null, null);
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core. Вызов манагед кода из натива
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.08.16 09:13
Оценка:
Здравствуйте, Serginio1, Вы писали:
Выложил статьи
Разработка → Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux II
Асинхронное программирование в 1С через .Net Native ВК


Исходники здесь
и солнце б утром не вставало, когда бы не было меня
Re: 1С,Linux,Excel,Word,OpenXML,Net Core
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.08.16 11:12
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>1С,Linux,Excel,Word,OpenXML,Net Core


S>Исходники здесь
и солнце б утром не вставало, когда бы не было меня
Re: Ошибка ucrtbase.dll Недопустимый параметр был передан фу
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 30.08.16 08:52
Оценка:
Здравствуйте, Serginio1, Вы писали:

Суть такая из натива вызываем статические методы .Net библиотеки.
Под 32 разрядными dll и exe все прекрасно.

Скомпилировал под 64 разрядное. Если запускать из экзешника
То все нормально. Но если из 64 разрядной 1С 8.3.9

Выдает ошибку

Необработанное исключение по адресу 0x00007FFD76FB8528 (ucrtbase.dll) в 1cv8.exe: Недопустимый параметр был передан функции, для которой недопустимые параметры вызывают неустранимую ошибку.

и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.09.2016 8:48 Serginio1 . Предыдущая версия . Еще …
Отредактировано 19.09.2016 8:46 Serginio1 . Предыдущая версия .
Отредактировано 19.09.2016 8:21 Serginio1 . Предыдущая версия .
Re[2]: Ошибка ucrtbase.dll Недопустимый параметр был передан функции
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 30.08.16 10:47
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S> Суть такая из натива вызываем статические методы .Net библиотеки.

S>Под 32 разрядными dll и exe все прекрасно.

S>Скомпилировал под 64 разрядное. Если запускать из экзешника

S>То все нормально. Но если из 64 разрядной 1С 8.3.9

Возможно ошибка из-за рефакторинга
https://msdn.microsoft.com/ru-ru/library/bb531344.aspx


Библиотека времени выполнения C (CRT)
Общие изменения
•Двоичные файлы, полученные в результате рефакторинга

Был осуществлен рефакторинг библиотеки CRT, в результате чего она была разделена на два разных двоичных файла — универсальный CRT (ucrtbase), который содержит большинство стандартных функциональных возможностей, и библиотеку времени выполнения VC (vcruntime140), которая содержит функции, связанные с компилятором, такие как обработка исключений и встроенные функции. В случае использования параметров проекта по умолчанию это изменение вас не затронет, так как компоновщик будет автоматически использовать новые библиотеки по умолчанию. Если вы установили для свойства Игнорировать все стандартные библиотекикомпоновщика в проекте значение Да или используете параметр компоновщика /NODEFAULTLIB в командной строке, необходимо обновить список библиотек (в свойстве Дополнительные зависимости), чтобы включить в него новые подвергнутые рефакторингу библиотеки. Замените старую библиотеку CRT (libcmt.lib, libcmtd.lib, msvcrt.lib, msvcrtd.lib) эквивалентными подвергнутыми рефакторингу библиотеками. Для каждой из двух подвергнутых рефакторингу библиотек существует статическая (.lib) и динамическая (.dll) версии, а также версия выпуска (без суффикса) и отладочная версия (с суффиксом "d"). Динамические версии имеют библиотеку импорта, с которой выполняется связь. Рефакторингу подвергнуты две библиотеки: универсальная CRT (а именно ucrtbase.dll или ucrtbase.lib, ucrtbased.dll или ucrtbased.lib) и библиотека времени выполнения VC — libvcruntime.lib, libvcruntime.dll, libvcruntimed.lib и libvcruntimed.dll. См. раздел Особенности библиотеки CRT.

и солнце б утром не вставало, когда бы не было меня
Re[2]: Ошибка ucrtbase.dll Недопустимый параметр был передан
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.09.16 09:02
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S> Суть такая из натива вызываем статические методы .Net библиотеки.

S>Под 32 разрядными dll и exe все прекрасно.

S>Скомпилировал под 64 разрядное. Если запускать из экзешника

S>То все нормально. Но если из 64 разрядной 1С 8.3.9


Вот Стек

ucrtbase.dll!_invoke_watson() Нет данных
ucrtbase.dll!_invalid_parameter() Нет данных
ucrtbase.dll!_invalid_parameter_noinfo() Нет данных
ucrtbase.dll!_setmode() Нет данных
clrjit.dll!jitStartup() Нет данных
coreclr.dll!EEJitManager::SetCpuInfo(void) Нет данных
coreclr.dll!EEJitManager::LoadJIT(void) Нет данных
coreclr.dll!UnsafeJitFunction(class MethodDesc *,class COR_ILMETHOD_DECODER *,unsigned long,unsigned long,unsigned long *) Нет данных
coreclr.dll!MethodDesc::MakeJitWorker(class COR_ILMETHOD_DECODER *,unsigned long,unsigned long) Нет данных
coreclr.dll!MethodDesc::DoPrestub(class MethodTable *) Нет данных
coreclr.dll!PreStubWorker() Нет данных
coreclr.dll!ThePreStub() Нет данных
coreclr.dll!UMThunkStub() Нет данных
> AddInNetObjectToNative64.dll!NetObjectToNative::ManagedDomainLoader::CreateManagedDomain(NetObjectToNative::CoreClrStartParams * pCoreClrStartupParams)Строка 128 C++



В новой версии .Net Core 1.0.1
https://blogs.msdn.microsoft.com/dotnet/2016/09/13/announcing-september-2016-updates-for-net-core-1-0/

Исправили ошибку

https://github.com/dotnet/coreclr/issues/6460

In Jitstartup, JIT creates a file descriptor for stdout and unconditionally passes it to setmode, without checking for failures. This happens at https://github.com/dotnet/coreclr/blob/ee680783778ed0abb186ae41a8c861d5cdcadccd/src/jit/ee_il_dll.cpp#L76.

Failure to check for invalid descriptors can result in setmode triggering failfast.


Сейчас все без ошибок
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.09.2016 8:45 Serginio1 . Предыдущая версия . Еще …
Отредактировано 19.09.2016 8:19 Serginio1 . Предыдущая версия .
Re[2]: Ошибка ucrtbase.dll Недопустимый параметр был передан фу
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.09.16 08:46
Оценка: 24 (1)
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S> Суть такая из натива вызываем статические методы .Net библиотеки.

S>Под 32 разрядными dll и exe все прекрасно.

S>Скомпилировал под 64 разрядное. Если запускать из экзешника

S>То все нормально. Но если из 64 разрядной 1С 8.3.9


В новой версии .Net Core 1.0.1
https://blogs.msdn.microsoft.com/dotnet/2016/09/13/announcing-september-2016-updates-for-net-core-1-0/

Исправили ошибку

https://github.com/dotnet/coreclr/issues/6460

In Jitstartup, JIT creates a file descriptor for stdout and unconditionally passes it to setmode, without checking for failures. This happens at https://github.com/dotnet/coreclr/blob/ee680783778ed0abb186ae41a8c861d5cdcadccd/src/jit/ee_il_dll.cpp#L76.

Failure to check for invalid descriptors can result in setmode triggering failfast.


Сейчас все без ошибок
и солнце б утром не вставало, когда бы не было меня
Re: Виртуальгые машины.Обмен по Tcp/IP
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.09.16 07:32
Оценка:
Можно ли под машиной запустить Windows и Linux. Под Windows считывать данные и передавать их в приложения под Linux по TCP/IP

Под многое оборудование для Linux нет драйверов. Но вот хотел узнать про виртуальные машины. Можно держать Linux и Windows и обмениваться по TCP/IP.
Сейчас пишу статью по кроосплатформенному применению .Net Core в 1С и обмену по Tcp/IP между различными устройствами.И нужны примеры применения
и солнце б утром не вставало, когда бы не было меня
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.