Информация об изменениях

Сообщение Re: .Net Core. Вызов манагед кода из натива от 28.06.2016 8:58

Изменено 28.06.2016 9:09 Serginio1

Здравствуйте, 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

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


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

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

}
Re: .Net Core. Вызов манагед кода из натива
Здравствуйте, 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);

}