ourpalm / ilruntime Goto Github PK
View Code? Open in Web Editor NEWPure C# IL Intepreter Runtime, which is fast and reliable for scripting requirement on enviorments, where jitting isn't possible.
License: Other
Pure C# IL Intepreter Runtime, which is fast and reliable for scripting requirement on enviorments, where jitting isn't possible.
License: Other
如果我 ILRTClass继承了 c#Class,并且在test()函数里执行力base.xxx() 那么,我在c#里通过 app.invoke(instance, "test")来调用这个方法的时候, test里面的代码就会执行两次。因为一次是我invoke调用的,一次貌似是adapter中转的时候调用的
c#
//#if ILRT
[ILRuntime.Other.NeedAdaptor]
//#endif
public class HKSpriteModel
{
public string ModelName;
public virtual void InitModel()
{
this.LogMessageInfo("parent init");
}
}
ILRT
public class HKMonsterSpriteModel : HKSpriteModel
{
public int index = 0;
public override void InitModel()
{
base.InitModel();
Debug.Log("sub init");
index++;
}
public void test()
{
InitModel();
this.LogMessageInfo("index = " + index + this.ModelName);
}
}
c#中调用部分
app.invoke(instance, "InitModel", null)
结果:
会输出两次 "sub init"
并且 index = 2 了
Vector2[] a = new Vector2[10000];
for (int i = 0; i < 10000; i++)
{
a[i]=Vector2.one;
}
你好,不知道这个库可以用于苹果商店的热更新吗?
测试代码如下:
class MyTest1
{
public static void UnitTest_JsonMap()
{
string json = "{\"Items1\":{\"one\":{\"Type\":1},\"two\":{\"Type\":2}},\"Items2\":{\"one\":{\"Type\":\"OneType\"},\"two\":{\"Type\":\"TwoType\"}}}";
MyTestDataMap data =JsonMapper.ToObject<MyTestDataMap> (json);
Console.WriteLine("Type : " + data.Items1["one"].Type);
Console.WriteLine("Type : " + data.Items2["one"].Type);
}
}
class MyTestDataItem1 // : TestClass3
{
public int Type;
}
class MyTestDataItem2 // : TestClass3
{
public string Type;
}
class MyTestDataMap //: TestClass3
{
public Dictionary<string, MyTestDataItem1> Items1;
public Dictionary<string, MyTestDataItem2> Items2;
}
在AddObjectMetadata()的时候,Items1和Items2的类型没有区分开来,当处理Items2的时候,ElementType用的还是MyTestDataItem1,因此会报错:
Can't assign value 'OneType' (type System.String) to type Type: Int32
i have a class like this:
public static class Check
{
public static void Test(T value)
{
if (value == null) ;
}
}
And the i invoke like this:Check.Test(new byte[] {1,2}); it will crash
`public class B
{
public int aa = 2;
public virtual void Print()
{
Debug.Log("I am B"); ;
}
}
public class Class1
{
public static void ParseDB<T>(System.Action<T> cbk) where T : B, new()
{
}
public static string Test()
{
ParseDB<B>((d) =>
{
});
return "xxxx1";
}
}`
当一个对象数组,在使用out参数传递时会出错,测试代码如下:
public static void UnitTest_Out2()
{
Dictionary<string, TestClassC[]> data = new Dictionary<string, TestClassC[]>();
data["key"] = new TestClassC[0];
TestClassC[] item;
data.TryGetValue("key", out item);
Console.WriteLine("value : " + item);
}
class TestClassC
{
}
BindingCodeGenerator.cs
Line:307
CrawlAppdomain()方法里
foreach (var i in ((CLR.TypeSystem.ILType)type).GetConstructors())
methods.Add(i);
这里并没有包含StaticConstructor。
这样可能会导致一些在静态构造方法里创建的泛型类的构造方法不会生成到绑定代码中,导致在il2cpp下出错。
Dictionary中加出数组会报错,代码:
public static Dictionary<string, MyData[]> data = new Dictionary<string, MyData[]>();
public static void UnitTest_Test1()
{
data["test"] = new MyData[5];
}
错误信息:
Test:TestCases.MyTest.UnitTest_Test1
TestResult:False
Log:
类型“ILRuntime.Runtime.Intepreter.ILTypeInstance[]”的对象无法转换为类型“ILRuntime.Runtime.Intepreter.ILTypeInstance”。
Local Variables:
IL_0011: callvirt System.Void System.Collections.Generic.Dictionary`2<System.String,TestCases.MyData[]>::set_Item(!0,!1)
at TestCases.MyTest.UnitTest_Test1() D:\lib\ILRuntime\TestCases\MyTest.cs:Line 14
System.ArgumentException: 类型“ILRuntime.Runtime.Intepreter.ILTypeInstance[]”的对象无法转换为类型“ILRuntime.Runtime.Intepreter.ILTypeInstance”。
在 System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
在 System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
在 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
在 ILRuntime.CLR.Method.CLRMethod.Invoke(ILIntepreter intepreter, StackObject* esp, List`1 mStack, Boolean isNewObj) 位置 D:\lib\ILRuntime\ILRuntime\CLR\Method\CLRMethod.cs:行号 271
在 ILRuntime.Runtime.Intepreter.ILIntepreter.Execute(ILMethod method, StackObject* esp, Boolean& unhandledException) 位置 D:\lib\ILRuntime\ILRuntime\Runtime\Intepreter\ILIntepreter.cs:行号 1729
=======================
public class TClass3<T> where T : class
{
public void Test()
{
Debug.LogError("TClass3 test..");
}
}
public class Class3 : TClass3<Class3>
{
}
// not work
var rObj = __app.Instantiate("WindHotfix.Test.Class3");
__app.Invoke("WindHotfix.Test.Class3", "Test", rObj);
public class TClass3<T> where T : class
{
public virtual void Test()
{
Debug.LogError("TClass3 test..");
}
}
public class Class3 : TClass3<Class3>
{
public override void Test()
{
base.Test();
}
}
// work
var rObj = __app.Instantiate("WindHotfix.Test.Class3");
__app.Invoke("WindHotfix.Test.Class3", "Test", rObj);
我这边很多地方有不重载父类方法的需求。
public static Dictionary<EAttrType, EAttrType[]> dicAttrConver5 = new Dictionary<EAttrType, EAttrType[]>() {
{
EAttrType.Strength,new EAttrType[]{ EAttrType.Dexterity}},
};
在 untiy里点击动态绑定 生成时 会报错 ArgumentException:failed to convert parmeters
发现char类型在转换成字符串的时候,同样的代码生成的IL会有差异(但都是vs2015,原因还不清楚)
第一种:
IL_00f2: ldloca.s c
IL_00f4: call instance string [mscorlib]System.Char::ToString()
IL_00f9: call string [mscorlib]System.String::Concat(string, string)
第二种:
IL_00e6: ldloca.s c
IL_00e8: constrained. [mscorlib]System.Char
IL_00ee: callvirt instance string [mscorlib]System.Object::ToString()
IL_00f3: call string [mscorlib]System.String::Concat(string, string)
第一种执行的结果正常,第二种字符转换成字符串后会变成数字。
下面两种不同的类型,用此方法生成的名称是一样的:
typeof(Dictionary<string, ILTypeInstance>).GetClassName(out className, out realClassName, out isByRef);
Console.WriteLine(className);
typeof(Dictionary<string, ILTypeInstance[]>).GetClassName(out className, out realClassName, out isByRef);
Console.WriteLine(className);
都是:
System_Collections_Generic_Dictionary_2_String_ILTypeInstance_Binding
测试用例如下:
class MyTest1
{
public static void UnitTest_Test1()
{
string json = "[{\"Name\":\"MyName\"}]";
List<MyTestDataA> data = JsonMapper.ToObject<List<MyTestDataA>>(json);
Console.WriteLine("Name : "+data[0].Name);
}
}
class MyTestDataA : TestClass3
{
public string Name;
}
TestClass3即现有用例中的ILRuntimeTest.TestFramework.TestClass3。
static bool TryGet(out A a)
{
a = null;
return true;
}
public static string Test()
{
A aaa;
TryGet(out aaa);
}
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
System.Collections.Generic.List`1[System.Object].get_Item (Int32 index) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:633)
ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/ILRT/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:807)
Rethrow as ILRuntimeException: Argument is out of range.
Parameter name: index
IL_0002: stind.ref
Game.DSimpleTown.TryInSoldierLst(Int32 soldierId, DSoldier& dSoldier) Code/Data/Player/DSimpleTown.cs:Line 75
public enum InheritEnum : ushort
{
无 = 0,
组 = 100,
}
public static void testUnicodeEnum()
{
var t = InheritEnum.无;
Console.WriteLine(t.ToString());
}
public class DictionaryEnumeratorTest<TKey, TValue>
{
Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>();
public void Add(TKey key, TValue value)
{
dic.Add(key, value);
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return dic.GetEnumerator(); //报错
}
public void GetEnumeratorTest()
{
var e = dic.GetEnumerator(); //正常
while (e.MoveNext())
{
UnityEngine.Debug.Log(e.Current.Key + " " + e.Current.Value);
}
}
public void GetEnumeratorTest2()
{
IEnumerator<KeyValuePair<TKey, TValue>> e = dic.GetEnumerator(); //报错
while (e.MoveNext())
{
UnityEngine.Debug.Log(e.Current.Key + " " + e.Current.Value);
}
}
}
public class MyTest
{
public static void Test()
{
DictionaryEnumeratorTest<int, int> t = new DictionaryEnumeratorTest<int, int>();
t.Add(1, 1);
t.GetEnumeratorTest();
t.GetEnumeratorTest2();
var e = t.GetEnumerator();
while (e.MoveNext())
{
UnityEngine.Debug.Log(e.Current.Key + " " + e.Current.Value);
}
}
}
struct MyStruct
{
public int i;
}
public void Awake()
{
var m = new MyStruct[10];
m[0] = new MyStruct(); // `Throw exception here.`
}
Exception info:
NotImplementedException: The requested feature is not implemented.
ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/Plugins/ILRuntime/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:2860)
Rethrow as ILRuntimeException: The requested feature is not implemented.
IL_000f: initobj TestILR/MyStruct
TestILR.Awake() c:/Working/p21/devel/client/P21/Assets/Scripts/_Test/TestILR.cs:Line 18
public class TJ
{
public bool b = true;
}
public class TestJson
{
public void Start()
{
Debug.Log("TestJson1");
var tj = new TJ();
var json = JsonMapper.ToJson(tj);
Debug.Log(json); //output: {"b":1} Error
var outTj = JsonMapper.ToObject<TJ>(json); //Error Point!
Debug.Log(outTj.b);
}
}
Serialization has a problem. This is the bool type. The program returns a int type to me.
JsonException: Can't assign value '1' (type System.Int32) to type System.Boolean
LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader) (at Assets/Standard Assets/RunTime/LitJson/JsonMapper.cs:401)
LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader) (at Assets/Standard Assets/RunTime/LitJson/JsonMapper.cs:469)
LitJson.JsonMapper.JsonToObject (ILRuntime.Runtime.Intepreter.ILIntepreter intp, ILRuntime.Runtime.Stack.StackObject* esp, System.Collections.Generic.List`1 mStack, ILRuntime.CLR.Method.CLRMethod method, Boolean isNewObj) (at Assets/Standard Assets/RunTime/LitJson/JsonMapper.cs:1009)
ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/Standard Assets/RunTime/ILRuntime/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:1718)
Rethrow as ILRuntimeException: Can't assign value '1' (type System.Int32) to type System.Boolean
IL_001f: call !!0 LitJson.JsonMapper::ToObject<TJ>(System.String)
TestJson.Start()
GameMain.Start(GameObject gameObject)
public static class Check
{
public static void Test(T value)
{
if (default(T) == null) ;
}
}
Check.Test(1);
///Unity Class
public class ResourceBase
{
}
public abstract class AssetBundleLoader
{
}
public class AssetBundleLoader<T> : AssetBundleLoader
{
public Action<T> OnLoadOver;
public void LoadOver(T o)
{
if (OnLoadOver != null)
{
OnLoadOver(o);
}
}
}
///Dll Test
public static void TestDelegateNull()
{
Console.WriteLine("TestDelegateNull ");
AssetBundleLoader gg=new AssetBundleLoader();
gg.OnLoadOver = OnLoadOver;
gg.LoadOver(null);
Console.WriteLine("TestDelegateNull end ");
}
public static void OnLoadOver(ResourceBase rb)
{
Console.WriteLine("OnLoadOver");
}
if (!EntityDef.id2datatypes.TryGetValue(msgargtypes[i], out argtypes[i]))
这样写,argtypes[i]有时候是空值
KBEDATATYPE_BASE n = null;
EntityDef.id2datatypes.TryGetValue(msgargtypes[i], out n);
argtypes[i] = n;
要改成这样才行~~
public static void Swap<T>(T[] arr, int idx1, int idx2)
{
if (idx1 >= arr.Length || idx2 >= arr.Length) return;
T temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
public static string Test()
{
Swap(new int[] { 1, 2 }, 0, 1);
}
NotImplementedException: The requested feature is not implemented.
ILRuntime.CLR.TypeSystem.ILGenericParameterType.MakeArrayType () (at Assets/ILRT/ILRuntime/CLR/TypeSystem/ILGenericParameterType.cs:113)
ILRuntime.CLR.Method.ILMethod.InitParameters () (at Assets/ILRT/ILRuntime/CLR/Method/ILMethod.cs:500)
ILRuntime.CLR.Method.ILMethod.get_Parameters () (at Assets/ILRT/ILRuntime/CLR/Method/ILMethod.cs:198)
使用CLR绑定string后,最导致栈溢出错误(在IL2CPP模式下)
public static void TestArrayNull()
{
Console.WriteLine("TestArrayNull");
byte[] b = null;
if (b != null && b.Length > 0)
{
}
Console.WriteLine("TestArrayNullEnd ");
}
测试代码(脚本):
public static Dictionary<string, int> p3 = new Dictionary<string, int>();
... ...
p3["1"] = 1;
p3["2"] = 2;
p3["3"] = 3;
p3["4"] = 4;
p3["5"] = 5;
p3["6"] = 6;
p3["7"] = 7;
p3["8"] = 8;
p3["9"] = 9;
p3["10"] = 10;
p3["11"] = 11;
p3["12"] = 12;
... ...
string key;
Dictionary<string, int>.Enumerator enumerator = p3.GetEnumerator();
while (enumerator.MoveNext())
{
key = enumerator.Current.Key;
}
发现如下类型因为没有被缓存到mapType中,每次调用AppDomain.GetType()都会重新生成一次:
System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
error:
Rethrow as ILRuntimeException: Object reference not set to an instance of an object
IL_0045: ldfld UnityEngine.Object AssetsData::assetsData
error line:
if (ad.assetsData == null)
code:
AssetsData ad = apm.GetAssetByAssetName(iconName, eAssetsType.Texture);
if (ad == null)
{
DebugLoger.LogError("PlayBGMSound 失败 没有加载到对应的资源" + iconName);
return;
}
if (ad.assetsData == null)
{
DebugLoger.Log("Loger ad.assetsData null");
return;
}
//Delegate Remove Order cause different result
static Action OnShowMessage;
static void AddDelegate()
{
OnShowMessage += show1;
OnShowMessage += show2;
OnShowMessage += show3;
OnShowMessage += show4;
}
static void ExcuteDelegate()
{
if (OnShowMessage != null)
{
OnShowMessage("Excute");
}
}
static void WrongRemoveDelegate()
{
//移除顺序
OnShowMessage -= show1;
OnShowMessage -= show3;
OnShowMessage -= show4;
OnShowMessage -= show2;
}
public static void TestWrongAddRemoveDelegate()
{
AddDelegate();//
ExcuteDelegate();// Excute1 Excute2 Excute3 Excute4
WrongRemoveDelegate();
Console.WriteLine("WrongExcute Check");
ExcuteDelegate();// Error Result Excute1
}
public static void TestRightAddRemoveDelegate()
{
AddDelegate();//
ExcuteDelegate();// Excute1 Excute2 Excute3 Excute4
RightRemoveDelegate();
Console.WriteLine("RightExcute Check");
ExcuteDelegate();// Right Result
}
static void RightRemoveDelegate()
{
//Remove 4 3 2 1
OnShowMessage -= show4;
OnShowMessage -= show3;
OnShowMessage -= show2;
OnShowMessage -= show1;
}
static void show1(string mes)
{
Console.WriteLine(mes+" 1");
}
static void show2(string mes)
{
Console.WriteLine(mes + " 2");
}
static void show3(string mes)
{
Console.WriteLine(mes + " 3");
}
static void show4(string mes)
{
Console.WriteLine(mes + " 4");
}
请问这个appDomain.DelegateManager.RegisterMethodDelegate<int, float>();委托的注册可以放到热更的DLL中么。
从泛型函数的角度来讲,原理上应该是不可以的啊。但是我测试了下,好像也没什么问题。所以想了解下这个是否真的可以。谢谢
遇到包含RepeatedField<int>类型的proto类就报如下错误:
MyExpception.HandleException, e:The method or operation is not implemented.
Local Variables:
T v0 = null
IL_0009: box T
at Google.Protobuf.FieldCodec`1<System.Int32>..cctor() D:\GameLogic\Plugins\Google.Protobuf\FieldCodec.cs:Line 351
测试用例如下:
public static void UnitTest_Type()
{
if(typeof(MyTestDataItem1).Equals(typeof(MyTestDataItem2)))
{
Console.WriteLine("MyTestDataItem1 == MyTestDataItem2");
}
else
{
Console.WriteLine("MyTestDataItem1 != MyTestDataItem2");
}
}
}
class MyTestDataItem1
{
public int Type;
}
class MyTestDataItem2
{
public string Type;
}
两个不同的类,Type比较的结果是一样的。
字符串多个字段连接后,会被转换成string.concat,但是并没有转换成正确的值。
My unity project will use the third party plug-in(NoesisGUI), the plug-in used the C++ DLL , and the plug-in C# part of the use of P/Invoke.
My class needs to be registered to the plug-in, or plug-ins need to be registered by reflection of my class.
My class needs to execute in Runner IL, so I think the only way is to run the plugin in Runner IL.
Do you have any other ideas?
测试用例如下:
class MyTest1
{
public static void UnitTest_JsonMap()
{
string json = "{\"Items\":{\"one\":{\"Type\":\"OneType\"},\"two\":{\"Type\":\"TwoType\"}}}";
MyTestDataMap data =JsonMapper.ToObject<MyTestDataMap> (json);
Console.WriteLine("Type : "+data.Items["one"].Type);
}
}
class MyTestDataItem : TestClass3
{
public string Type;
}
class MyTestDataMap : TestClass3
{
public Dictionary<string, MyTestDataItem> Items;
}
public static void TestStringFormat()
{
Console.WriteLine("TestStringFormat");
var ts = string.Format("{0}{1}{2}{3}",1,"gfgf",-3,4);
Console.WriteLine(ts);
Console.WriteLine("TestStringFormat End");
}
想问一下,这套方案对vs版本和.net版本是否有做要求,会不会不同的vs/net版本不同导致生成IL代码略有不同,以至于解析出错?
if(v is Int32) //这里报错
{
return true;
}
if (v.GetType() == typeof(Int32)) //改写成这样就可以了
{
return true;
}
我将demo中 dll放在web服务器上 然后unity中用WWW加载(例如:http://127.0.0.1/xxx.dll)服务器上的dll 没有运行想要的效果, 但mine类型我都改过了 本地浏览器是可以打开
public struct TestStruct
{
public int id;
public override string ToString()
{
return id.ToString();
}
}
public static void TestMethodDefaultStructValue()
{
PrintValue(100);
}
public static void PrintValue(int a, TestStruct b = default(TestStruct))
{
Console.WriteLine("a = " + a + ", b = " + b.ToString());
}
hi:
i write following code in the dll:
float a = 1.0f;
float b = a/2;
var str = string.Format("{0:0.000}", b);
run with exception:
NotImplementedException: The requested feature is not implemented.
ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/ILRuntime/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:2135)
Rethrow as ILRuntimeException: The requested feature is not implemented.
IL_0012: box System.Single
HotFix_Project.InstanceClass.TestError() I:/New_Project/unity_lua_benchmark/HotFix-Project/InstanceClass.cs:Line 39
but following code works fine:
float a = 1.0f;
var str = string.Format("{0:0.000}", a);
it's maybe a boxing issue?
定义一个枚举类型在本地代码里
enum TestEnum
{
One,
Two
}
在热更代码里定义
var testEnum = TestEnum.Two;
Debug.Log($"{testEnum} : {testEnum.ToString()}")
输出的是"Two : 1"
在本地代码中得到的结果是"Two : Two"
在此种用法中热更代码里和本地代码里的结果行为不一致
测试用例:
`
using System;
using LitJson;
namespace TestCases
{
public class EnumTest
{
public enum TestEnum : long
{
Enum1,
Enum2,
Enum4 = 0x123456789,
}
public static void Test11()
{
//热更内定义的枚举
var testEnum = TestEnum.Enum4;
var valueDirectly = $"{testEnum}";
var valueToString = testEnum.ToString();
Console.WriteLine($"隐式字符值: {valueDirectly}");
Console.WriteLine($"显式字符值: {valueToString}");
if (valueDirectly.Equals(valueToString) == false)
{
throw new Exception($"字符值不一致: {valueDirectly} vs. {valueToString}");
}
//本地定义的枚举
var jsonType = JsonType.Int;
valueDirectly = $"{jsonType}";
valueToString = jsonType.ToString();
Console.WriteLine($"隐式字符值: {valueDirectly}");
Console.WriteLine($"显式字符值: {valueToString}");
if (valueDirectly.Equals(valueToString) == false)
{
throw new Exception($"字符值不一致: {valueDirectly} vs. {valueToString}");
}
}
}
}
`
C#:
public Vector3? Test()
{
return null;
}
ILRT:
var v3 = XXXX.Instance.Test();
if (null != v3)
{
logger.LogMessageInfo("v3 = ", v3.Value);
}
这样在判断非空那一行就会报错
public static class Check
{
public static void Test2(T obj)
{
Action action = (value) => { };
}
}
Check.Test2(1); it will crash
测试代码:
typeof(Dictionary<string, ILTypeInstance>.Enumerator).GetClassName(out className, out realClassName, out isByRef);
会产生循环调用。此错误会影响到为Enumerator生成方法绑定。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.