bool res = mD->pCallAsFunc(Target, MethodMame.c_str(), &RetVal, Params, argCount, &Error);
вызывается статическая функция на стороне .Net
public static bool CallAsFunc(int Target, IntPtr ИмяМетодаPtr, IntPtr ReturnValue, IntPtr МассивПараметров, int РазмерМассива, IntPtr ErrorPtr)
{
object result = null;
var res = CallAsFuncAll(Target,ИмяМетодаPtr,МассивПараметров,РазмерМассива,ErrorPtr, out result);
if (!res)
return res;
bool IsReturnValue = ReturnValue != IntPtr.Zero;
if (IsReturnValue)
РаботаСВариантами.УстановитьОбъектВIntPtr(ОбернутьОбъект(result), ReturnValue);
else if (result is AutoWrap)
{
AutoWrap temp = result as AutoWrap;
СписокОбъектов.RemoveKey(temp.ИндекасВСписке);
}
return true;
}
var SB = window.CallNetMethod(0,"Новый",["System.Text.StringBuilder"]);
var res = window.CallNetMethod(SB.Id,"Append",["Первая строка"]);
window.DeleteNetObject(res.Id);
var ToStr= window.CallNetMethod(SB.Id,"ToString");
alert(ToStr);
window.CallNetPropertySet(SB.Id,"Capacity",40);
res=window.CallNetPropertyGet(SB.Id,"Capacity");
alert(res);
Вызывается Handler CEF.
bool CallNetObjectFunction::Execute(const CefString& name,
CefRefPtr<CefV8Value> object,
const CefV8ValueList& arguments,
CefRefPtr<CefV8Value>& retval,
CefString& exception) {
const size_t argumentsCount = arguments.size();
vector<wstring> savedstrings;
NetObjectToNative::tVariant* Params = nullptr;
int Target = arguments[0]->GetIntValue();
wstring MethodMame = arguments[1]->GetStringValue().ToWString();
CefRefPtr<CefV8Value> params;
size_t argCount = 0;
if (argumentsCount == 3)
{
params = arguments[2];
if (!params->IsArray())
{
exception = CefString(L"Для вызова метода 3 параметр должен быть массивом");
return true;
}
argCount = params->GetArrayLength();
}
if (argCount > 0)
{
savedstrings.reserve(argCount);
Params = new NetObjectToNative::tVariant[argumentsCount];
NetObjectToNative::tVariant* Param = Params;
for (size_t i = 0; i < argCount; ++i)
{
NetObjectToNative::ConvertCEFtoNet(params->GetValue(i), &Param[i], savedstrings);
}
}
wchar_t* Error = nullptr;
NetObjectToNative::tVariant RetVal;
bool res = mD->pCallAsFunc(Target, MethodMame.c_str(), &RetVal, Params, argCount, &Error);
if (res)
{
retval = NetObjectToNative::ConvertNetToCef(&RetVal, true);
}
else
{
if (Error)
exception = CefString(std::wstring(Error));
delete Error;
}
if (Params) delete[] Params;
return true;
}
Я же написал в чем отличие
Прежде всего видим главные отличия от C#. Для получения свойства нужно добавить "_"
let Default = Configuration._Default;
Для вызова асинхронного метода нужно добавить ключевое слово async:
let document = await Context.async.OpenAsync(address);
Для вызова дженерик метода, если нельзя вывести типы по параметрам то аргументы указываем в массиве:
let rows = ApiExtensions.QuerySelectorAll([IHtmlTableRowElement], document, rowSelector);
Ну и главное, нужно вручную удалить ссылку на объект со стороны .Net
Строки копируются.
Я никого не заставляю использовать мой продукт, я делюсь опытом.
Я в 1С прекрасно совмещаю как .Net объекты так и 1С. И никаких неудобств мне это не приносит. А здесь в отличие от 1С я могу прикрутить типизацию
Структуры боксятся и можно вызывать методы наравне со статческими методами, методы дженериков с автовыводом типа. Поддержка параметров по умлчанию, params
// Получим Тип из сборки лежащей в каталоге приложения
let Тестовый = Net.GetType("TestDllForCoreClr.Тестовый", "TestDllForCoreClr");
// Создадим объект используя new
let TO = new Тестовый("Свойство из Конструктора");
Как это нельзя. В первом же примере мы работаем исключительно с объектами.
https://github.com/AngleSharp/AngleSharp
При этом этом в асинхронном методе оговаривается
//Метод расширения
//Task<IDocument> OpenAsync(this IBrowsingContext context, string address);
let document = await Context.async.OpenAsync(address);
// Не могу установить результат асинхронной функции класс Proxy с Target fuction
// Поэтому для объектов нужно вручную обернуть
document = NetObject.WrapResult(document, true);
Угу чем это отличие от HTTP запроса? Я знаю что за классы я использую.
Ну и чем ремотинг от HTTP запроса отличается?
Через await и увидит. Сейчас прикручиваю события.
Ну а как ты же говоришь о превосходстве out процессов. А значит есть сервер.
Я аргументиру это тем, что писать на один процес легче.
При этом обработку данных можно вынести в .Net сборку,
а там где скорость не критична можно использовать стандартные библиотеки.
Есть большой выбор в отличие от твоего подхода. За каждой мелочью премся на сервер.
Для меня как раз легче использовать мою разработку. Но у каждого свои предпочтения.
На самом деле, что касается 1С, то там на вопрос почему вы не используете мою разработку отвечают, что ты же не 1С.
Я ни кто, и зовут меня ни как. Но тот же Electron будут с удовольствием использовать ибо…
Там расписано как происходит маршалинг
вызывается статическая функция на стороне .Net
Вызывается Handler CEF.
Можешь почитать Использование классов .Net в 1С для новичков
Ну так конечно не получится. Пока не поддерживаются JS объекты.
Но они будут поддерживаться правда только на время вызова.
Кроме того можно использовать динамическую компиляцию
.Net Core, 1C, динамическая компиляция, Scripting API
Можешь почитать Использование классов .Net в 1С для новичков
Прежде всего видим главные отличия от C#. Для получения свойства нужно добавить "_"
let Default = Configuration._Default;
Для вызова асинхронного метода нужно добавить ключевое слово async:
let document = await Context.async.OpenAsync(address);
Для вызова дженерик метода, если нельзя вывести типы по параметрам то аргументы указываем в массиве:
let rows = ApiExtensions.QuerySelectorAll([IHtmlTableRowElement], document, rowSelector);
Ну и главное, нужно вручную удалить ссылку на объект со стороны .Net
Строки копируются.
Я никого не заставляю использовать мой продукт, я делюсь опытом.
Я в 1С прекрасно совмещаю как .Net объекты так и 1С. И никаких неудобств мне это не приносит. А здесь в отличие от 1С я могу прикрутить типизацию
https://github.com/AngleSharp/AngleSharp
При этом этом в асинхронном методе оговаривается
К сожалению в JS [] уже забиты для доступа свойств.
Ты это как хочешь называй. Но это по сути и есть внепроцеесный сервер, раз ты к нему обращаешься.
Ну и чем ремотинг от HTTP запроса отличается?
Через await и увидит. Сейчас прикручиваю события.
Ну а как ты же говоришь о превосходстве out процессов. А значит есть сервер.
При этом обработку данных можно вынести в .Net сборку,
а там где скорость не критична можно использовать стандартные библиотеки.
Есть большой выбор в отличие от твоего подхода. За каждой мелочью премся на сервер.
Что и так было ясно.
На самом деле, что касается 1С, то там на вопрос почему вы не используете мою разработку отвечают, что ты же не 1С.
Я ни кто, и зовут меня ни как. Но тот же Electron будут с удовольствием использовать ибо…