Сообщение Re: .Net Core. Вызов манагед кода из натива от 28.06.2016 8:58
Изменено 28.06.2016 9:09 Serginio1
Здравствуйте, Serginio1, Вы писали:
Сделал тестовый класс
И вызов из С++
//Теперь Создадим эклемпляр класса из сторонней сборки
Ну и вызов миллиона нетовской функции
// Сначала хотел закодировать ссылку в byte[]
// Но 1С может передавать в параметрах только булево,дату, числа и строки
Сделал тестовый класс
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, Вы писали:
Сделал тестовый класс
И вызов из С++
//Теперь Создадим эклемпляр класса из сторонней сборки
Ну и вызов миллиона нетовской функции
// Сначала хотел закодировать ссылку в byte[]
// Но 1С может передавать в параметрах только булево,дату, числа и строки
Сделал тестовый класс
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);
}