Code Monkey home page Code Monkey logo

lsharp's Introduction

A Pure C# IL Runner,Run DLL as a Script.直接解析执行IL的脚本引擎
	L#是FB引擎系列的一部分
	欢迎访问FB引擎主站http://www.FBact.com
	欢迎加入讨论QQ群:223823428
	用途,Unity3D热更(包括IOS平台)等
	Beta阶段,有一定动手能力的小伙伴,已经可以将它用于实战
	更新日志:
2016-03-18 V0.50.1Beta
	修正一处bool成员变量赋值问题
2016-03-04 V0.5Beta
	发现 VBox 复用机制写的有坑,重构了这个部分,极大的优化了栈上计算GC

2015-11-15 V0.48.1Beta
	vs2015 静态数组初始化的代码也不太一样
2015-11-15 V0.48Beta
	发现vs2015的编译结果不太一样,开始处理
	发现vs2015 !=null 的判断用的是gt指令,已处理

2015-04-14 V0.46Beta
	修改unity5 环境下Unittest 到il2cpp绝大部分通过,不通过的要改写绕过
2015-04-11 V0.45Beta
	同步unity unittest代码,unity5 环境下 unittest全部通过
	https://github.com/lightszero/LSharpUnity
2015-04-02 V0.44Beta
	调整了一下ThreadContext机制,每个线程只需要new一次,new的同时设为活动,多new会有个警告log
	修复了几处bug
2015-03-30 V0.43Beta
	修正 bool[] init
	修正 box on convert
2015-03-19 V0.42.7Beta
	修正a[1]++ 这种计算的Bug
2015-03-16 V0.42.6Beta
	修正dup指令的实现bug,导致i++处理顺序出错
2015-03-13 V0.42.5Beta
	修正switch case 偶尔会插入线程修饰不认识的问题
2015-03-13 V0.42.4Beta
	修正char数组的问题
2015-03-09 V0.42.3Beta
	修正bool数组的问题
2015-03-09 V0.42.2Beta
	修正修改函数参数的问题
2015-03-07 V0.42.1Beta
	修正了一处ulong传参转换问题
2015-02-27 V0.42Beta
	修正了一处搜索缺陷,查找LinkedList查找失败
2015-02-16 V0.41Beta
	增加了Mdb的支持,通过反编译MonoDevelop中的mono.cecil.mdb实现
2015-02-13 V0.40.1Beta
	修复脚本中定义的enum 作为参数时的问题
2015-02-05 V0.40Beta
	之前一直插dll,在unity下用的不顺畅,终于排查掉了这个问题,现在可以直接插入源码了
2015-02-02 V0.39.7Beta
	修正了调用函数使用enum参数的问题
2015-01-30 V0.39.6Beta
	修正了数值数组初始化的问题
2015-01-30 V0.39.5Beta
	修正了脚本定义struct
	修正了使用 Type作为参数的函数调用问题
2015-01-28 V0.39.4.1Beta
2015-01-28 V0.39.4Beta
	修改了一小批bug
2015-01-28 V0.39.3Beta
	修改一处参数bug
2015-01-28 V0.39.2Beta
	修改了一些继承检查,有充分的警告
2015-01-27 V0.39.1Beta
	修改了数组取值的一点问题
	时隔5天才发现新的Bug,
	正式作为Beta版。
2015-01-22 V0.39PreBeta
	这几天帮助一个朋友进行了C#Light项目迁移L#的VIP服务(玩笑,只是他集中的发现了不少bug)
	L#的稳定性也得到了极大的增强
	将版本提升到PreBeta.
2015-01-21 V0.38.3Alpha
	修正一处参数传数值问题
2015-01-21 V0.38.2Alpha
	修正一处模板类型查找的问题
2015-01-21 V0.38.1Alpha
	修正一处参数的bug
2015-01-21 V0.38Alpha
	进行了一轮优化
2015-01-21 V0.37Alpha
	构造函数数值类型转换修复
2015-01-21 V0.36.9Alpha
	脚本内置类型数组修复
2015-01-21 V0.36.8Alpha
	参数检查顺序反了,严重bug,两个参数以上的call,不会检查类型了。
	已修复
2015-01-21 V0.36.7Alpha
	修复brfalse语句,if不命中时偶有问题
2015-01-19 V0.36.6Alpha
	修改了脚本对脚本调用传参的一处bug
2015-01-18 V0.36.5Alpha
	修改了一些委托相关的bug
2015-01-18 V0.36.4Alpha
	修改了一些在u3d环境的问题
2015-01-17 V0.36.3Alpha
	修改了一下MethodParamList的接口,防止滥用
	不允许再修改MethodParamList的内容
2015-01-17 V0.36.2Alpha
	Test01增加一个CrossBind的使用例子
2015-01-17 V0.36.1Alpha
    数组长度没实现,补上
2015-01-16 V0.36Alpha
    修复了一处直接调用函数bool传参的问题
	增加了用反射加载执行和用L#CLR加载执行的快速切换方式,见例子Test01
	增加了一个autoLogDump的参数
	 object IMethod::Invoke(ThreadContext context, object _this, object[] _params, bool bVisual,bool autoLogDump);
	脚本委托默认打开此参数
	打开此参数时,脚本内异常堆栈自动通过ILogger.LogError 输出
2015-01-16 V0.35.2Alpha
	脚本继承脚本时,没有区分虚实调用,导致脚本的base.XX()实际上调用的是this.XX(),已修复。
2015-01-15 V0.35.1Alpha
	给成员变量赋内部值类型时可能发生转换,已修复。
2015-01-14 V0.35Alpha
	Unity_HelloWorld 在WP运行成功
	调整了一个ForUnity目录,里面放基本的支持库
2015-01-14 V0.34Alpha
	Unity_HelloWorld 在IOS运行成功
2015-01-13 V0.33Alpha
	增加Dump机制
	Try catch 脚本执行入口,catch以后,调用
	string CLRSharp.ThreadContext.activeContext.Dump()
	可以Dump出脚本错误堆栈,这个函数完全可以外部实现
	可参考此函数自行Dump
2015-01-13 V0.32Alpha
	支持了CrossBind,让脚本可以通过绑定继承程序类型
	目前实现了yield,就是通过这种方式实现的
	env构造时就执行了这样两句
		RegCrossBind(new CrossBind_IEnumerable());
		RegCrossBind(new CrossBind_IEnumerator());
	这样就可以让脚本继承IEnumerable 和 IEnumerator
	也就是迭代器的基础

2015-01-13 V0.31.5Alpha
	处理了脚本继承脚本的虚函数问题
2015-01-13 V0.31.3Alpha
	处理了枚举值得box转换
2015-01-13 V0.31.2Alpha
	//值管理有泄露。。修复
2015-01-13 V0.31.1Alpha
	从loc来的变量没有Clone,导致计算错误
	//还有其他可能的各种bug
	//需要查一遍
2015-01-13 V0.31Alpha
	继续重构了堆栈数值类型部分,之前的虚调用太多,性能很差,改写
2015-01-13 V0.3Alpha
	重构了堆栈数值类型部分,解决一些数值类型执行上的bug
2015-01-12 V0.23Alpha
	加入一个MethodCache 和FieldCache,期待提升性能
2015-01-12 V0.22.2Alpha
	修复脚本中类中类的查找
2015-01-12 V0.22.1Alpha
	实现了switch指令
2015-01-12 V0.22Alpha
	规范修改了数值计算
2015-01-12 V0.21.1Alpha
	修复bug:if xxx==null问题
2015-01-12 V0.21Alpha
	修复bug:结构体的构造
2015-01-11 V0.20Alpha
	所有用例全部通过
2015-01-11 V0.17Alpha
	线程局部存储Context,委托调用安全
2015-01-11 V0.16Alpha
	try catch用例通过
	用例通过情况(38/39)
2015-01-11 V0.15Alpha
	增加EvilTesto用例九个
	用例通过情况(37/39)
	除try catch以外,基本语法都通了
2015-01-10 V0.10Alpha
	匿名函数实现
	用例通过情况(30/30)
	C#LightTestor所有用例移植完毕
2015-01-10 V0.07Alpha
	调整了代码结构,更顺畅,也为实现匿名函数打下了基础
	用例通过情况(29/30)
2015-01-09 V0.06Alpha
	修改了很多,基本测试基本通过
	用例通过情况(29/30)
2015-01-09 V0.05Alpha
	改进了类型匹配方法,对模板类型可以根据名称任意深度匹配
	用例通过情况(26/30)
2015-01-09 V0.04Alpha
	继续实现,推进了很多CLR的实现
	用例通过情况(24/30)
2015-01-08 V0.03Alpha
	增加了PDB的加载
	改变了界面显示,更容易对照源码和汇编
	增加了DebugLevel
2015-01-08 V0.02Alpha
	开始跑表达式用例
	用例通过情况(14/30)
2015-01-07 V0.01Alpha
	暂定名 L# 
	新坑报道,直接解析执行IL,相当于CLR的工作
	可用于Unity在IOS等奇葩平台解析执行,将所有dotnet语言作为脚本
	可用于Xamarin,silverlight ,wp winstore开发,只要有dotnet 2.0的环境即可。
	语法完美支持c# vb.net F#等任何语言,只要能编译为dll即可。
	目前实现程度还刚开始。
	可以跑个循环,调用静态函数。用例3个

lsharp's People

Contributors

a11s avatar diablohsh avatar hbqzq avatar lgr19870103 avatar lightszero avatar linzhanyu avatar lynn-ran avatar wukongiii avatar yeamour avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lsharp's Issues

byte[]赋值失败问题

测试Dll的源码
public class A
{
public void Test()
{
byte[] result = new byte[5]{1,1,1,1,1};
for (int i = 0; i < result.Length; i++)
{
Debug.Log("Before = " + result[i]);
result[i] = 2;
Debug.Log("After = " + result[i]);
}
}
}
在Unity中
public class B : MonoBehaviour
{
void Start()
{
//创建CLRSharp环境
//加载L#模块
//执行构造函数
…………
//调用A类的Test方法
IMethod method0 = wantType.GetMethod("Test",MethodParamList.constEmpty());
method0.Invoke(context, typeObj, null);
}
}

结果A类中Test方法里的result数组中的值没有改变,全部都为1。
用new初始化可以赋值成功,= 赋值失败

我用反射试了一下,没有上面的问题
public class C : MonoBehaviour
{
void Start()
{
TextAsset dll = Resources.Load("CryptoD") as TextAsset;
Assembly ass = Assembly.Load(dll.bytes);
Type type = ass.GetType("A");
Object obj = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("Test");
mi.Invoke(obj, null);
}
}

event事件bug

现象一:
例如:在一个类里面定了一个事件
class One
{
public static event System.Action UserLoginEvent;
.....
UserLoginEvent+=MyFun;
. ....
public void MyFun(int beh)
{
}
}

执行到UserLoginEvent+=MyFun;语句,提示UserLoginEvent为空,暴异常。而是用
UserLoginEvent=MyFun;第一次使用就可以。

现象二:
在上面现象一的基础上,在另外一个类里面。
class Two
{
....
One.UserLoginEvent+=TheOtherFun;
....

public void TheOtherFun(int beh)
{
}
}

执行到UserLoginEvent+=TheOtherFun;语句,提示UserLoginEvent为空,暴异常.而实际应用中,TheOtherFun函数响应了。
类One在类Two之前就先实例化了。

能否支持MDB?

在Unity项目使用UnityVS在VS中调试是使用的MDB调试文件,是否能支持这个功能?谢谢!

L#程序与宿主程序的通信过程中,无法获取到System.Action类型的函数

L#程序与宿主程序的通信过程中,无法获取到System.Action类型的函数,报错位置在Context文件的293行。以下是我这边跟踪此问题的一些过程:
System.Action 无法获取,但 System.Action 这种泛型版本可以获取到。 原因应该是两者不在同一个程序集。 System.Action所在的System.Core.dll 在CLRSharp_Environment的 moduleref,mapType等未看到。

vs2015下 !=操作会报错

GameObject go = new GameObject();
if (go != null)
{

}
任意变量进行!=操作都会重现
只要用vs2015编译的dll不管在vs2015还是vs2013都会报错。
vs2013编译的dll都不会报错

覆盖ToString,GetHashCode,Equals方法有问题

代码:

/// <summary>
/// 测试覆盖系统方法
/// </summary>
public class Test12
{
    public string Name;
    public int Age;

    public override string ToString()
    {
        return string.Format("Name:{0}, Age:{1}", Name, Age);
    }

    public override bool Equals(object obj)
    {
        if (!(obj is Test12))
        {
            return false;
        }
        var o = (Test12) obj;
        return Name == o.Name && Age == o.Age;
    }

    public override int GetHashCode()
    {
        //for test
        return 123456789;
    }

    public static void TestOverrideObjectMethod()
    {
        Test12 t1 = new Test12 {Name = "Test1", Age = 18};
        Test12 t2 = new Test12 {Name = "Test1", Age = 18};

        Logger.Log("t1.ToString(): " + t1);
        Logger.Log("t1.GetHashCode(): " + t1.GetHashCode());
        Logger.Log("t1.Equals(t2): " + t1.Equals(t2));
    }
}

执行结果:

t1.ToString(): CLRSharp.CLRSharp_Instance
t1.GetHashCode(): 30880833
t1.Equals(t2): False

用例代码: tony-tang@e337e71

想问个问题,是否在热更新的dll中无法使用反射?

例如想打印热更新的dll的名字, 会报错
[Message]
public class Entry
{
public static void Init()
{
UnityEngine.Debug.Log(typeof(Entry).Assembly.FullName);
}
}

TargetException: Object does not match target type.
System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:236)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
CLRSharp.Method_Common_System.Invoke (CLRSharp.ThreadContext context, System.Object _this, System.Object[] _params) (at Assets/Plugins/CLRSharp/CLRSharp/Type/System/System_Type.cs:483)
CLRSharp.Method_Common_System.Invoke (CLRSharp.ThreadContext context, System.Object _this, System.Object[] _params, Boolean bVisual) (at Assets/Plugins/CLRSharp/CLRSharp/Type/System/System_Type.cs:329)
CLRSharp.StackFrame.Call (CLRSharp.ThreadContext context, IMethod _clrmethod, Boolean bVisual) (at Assets/Plugins/CLRSharp/CLRSharp/Execute/StackFrame.cs:444)
CLRSharp.ThreadContext.RunCode (CLRSharp.StackFrame stack, CLRSharp.CodeBody body) (at Assets/Plugins/CLRSharp/CLRSharp/Execute/Context.cs:748)
CLRSharp.ThreadContext.ExecuteFunc (IMethod_Sharp method, System.Object _this, System.Object[] _params) (at Assets/Plugins/CLRSharp/CLRSharp/Execute/Context.cs:150)
CLRSharp.Method_Common_CLRSharp.Invoke (CLRSharp.ThreadContext context, System.Object _this, System.Object[] _params, Boolean bVisual) (at Assets/Plugins/CLRSharp/CLRSharp/Type/CLRSharp/CLRSharp_Type.cs:518)
CLRSharp.Method_Common_CLRSharp.Invoke (CLRSharp.ThreadContext context, System.Object _this, System.Object[] _params) (at Assets/Plugins/CLRSharp/CLRSharp/Type/CLRSharp/CLRSharp_Type.cs:531)
Init.Start () (at Assets/Scripts/Init.cs:38)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.