Здравствуйте, Serginio1, Вы писали:
S> Не читаешь ты. Прежде чем отправить в натив объект сохраняется в статическом массиве массиве. Жить он будет пока его из массива не удалят.
Ну, т.е. как и говорил, получаем или утечку объектов на managed-стороне, или адскую магию с рефкаунтингом (по, сути, переизобретение IUnknown).
Для сложных графов с изменяемыми свойствами-объектами тесты как минимум надо сделать
S>>Вообще-то неизвестна, в рантайме определяется. Достаточно только набора значений.
S> DLR то как раз статический. Но он мне все равно нужен для использования DynamicObject
Вот народ я с вас фигею. Вам дают карту с сокровищами, а вы требуете чтоб вас экспрессом минуя все три тома приключений доставили прямо в термал спа "Золотое кольцо" (магнитик на холодильник с Балрогом в подарок). Где ваша это... мазохизм? Стремление усложнить жизнь? Граблефилия? А, авантюризм, во!
Держите, скучный вы человек:
private static CallSite<Action<CallSite, Type, object, object>> callSite;
static void Main(string[] args)
{
CallADynamic(1, 2);
CallADynamic(null, null);
CallADynamic(null, new object());
}
private static void CallADynamic(params object[] data)
{
if (callSite == null)
{
callSite =
CallSite<Action<CallSite, Type, object, object>>.Create(
Binder.InvokeMember(
CSharpBinderFlags.ResultDiscarded,
"CallA", null, typeof(Program), new CSharpArgumentInfo[]
{
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
}));
}
callSite.Target(callSite, typeof(Program), data[0], data[1]);
}
static void CallA(params int[] args)
{
Console.WriteLine("params");
}
static void CallA(object a, object b)
{
Console.WriteLine("objects");
}
static void CallA(object a, string b)
{
Console.WriteLine("object+string");
}
Как допилить до вызова произвольного метода — сами-сами. Иначе вообще никакого удовольствия не будет.
| P.S. |
| |
| |