• Bridge.NET


    块作用域闭包问题

    结果正确:1

    容易引入JSB:1

     1 public class Program
     2 {
     3     static List<Action> createActions()
     4     {
     5         List<Action> arr = new List<Action>();
     6         for (int i = 0; i < 10; i++)
     7         {
     8             {
     9             int j = i;
    10             arr.Add(() =>
    11                     {
    12                 Console.WriteLine(j.ToString());
    13             });
    14         }
    15         }
    16         return arr;
    17     }
    18     static void bbtest()
    19     {
    20         var arr = createActions();
    21         for (int i = 0; i < arr.Count; i++)
    22         {
    23             arr[i]();
    24         }
    25     }
    26     public static void Main()
    27     {
    28         bbtest();
    29         //Console.WriteLine("Hello World!");
    30     }
    31 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         statics: {
     9             createActions: function () {
    10                 var arr = new (System.Collections.Generic.List$1(Function))();
    11                 for (var i = 0; i < 10; i = (i + 1) | 0) {
    12                     (function () {
    13                         {
    14                             var j = i;
    15                             arr.add(function () {
    16                                 Bridge.Console.log(j.toString());
    17                             });
    18                         }
    19                     }).call(this);
    20                 }
    21                 return arr;
    22             },
    23             bbtest: function () {
    24                 var arr = Demo.Program.createActions();
    25                 for (var i = 0; i < arr.getCount(); i = (i + 1) | 0) {
    26                     arr.getItem(i)();
    27                 }
    28             }
    29         },
    30         $main: function () {
    31             Demo.Program.bbtest();
    32             //Console.WriteLine("Hello World!");
    33         }
    34     });
    35 });
    View Code
     1 0
     2 1
     3 2
     4 3
     5 4
     6 5
     7 6
     8 7
     9 8
    10 9
    View Code

    ref/out

    结果正确:1

    容易引入JSB:1

     1 public class Program
     2 {
     3     class Apple
     4     {
     5         public int price;
     6     }
     7     static void testRef(ref int v)
     8     {
     9         v++;
    10     }
    11     static void testOut(out Apple a)
    12     {
    13         a = new Apple();
    14         a.price = 44;
    15     }
    16     public static void Main()
    17     {
    18         int v = 5;
    19         testRef(ref v);
    20         Console.WriteLine(v);
    21         
    22         Apple a = new Apple();
    23         testOut(out a);
    24     }
    25 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         statics: {
     9             testRef: function (v) {
    10                 v.v = (v.v + 1) | 0;
    11             },
    12             testOut: function (a) {
    13                 a.v = new Demo.Program.Apple();
    14                 a.v.price = 44;
    15             }
    16         },
    17         $main: function () {
    18             var v = { v : 5 };
    19             Demo.Program.testRef(v);
    20             Bridge.Console.log(v.v);
    21 
    22             var a = { v : new Demo.Program.Apple() };
    23             Demo.Program.testOut(a);
    24         }
    25     });
    26 
    27     Bridge.define("Demo.Program.Apple", {
    28         price: 0
    29     });
    30 });
    View Code
    1 6
    View Code

    重载函数

    结果正确:1

    容易引入JSB:? 重载函数是以$1 $2结尾的。可以的,看下面第3个代码,对重载函数按一定规则进行排序。

     1 public class Program
     2 {
     3     static void hello(int v)
     4     {
     5     }
     6     static void hello(string v)
     7     {
     8     }
     9     static void hello(int a, int b)
    10     {
    11     }
    12     public static void Main()
    13     {
    14     }
    15 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         statics: {
     9             hello: function (v) {
    10             },
    11             hello$2: function (v) {
    12             },
    13             hello$1: function (a, b) {
    14             }
    15         },
    16         $main: function () {
    17         }
    18     });
    19 });
    View Code
     1 string MethodToString(MethodInfo m)
     2 {
     3                StringBuilder sb = new StringBuilder();
     4 
     5                 sb.Append(m.ReturnType.ToString()).Append(" ");
     6                 sb.Append(m.Name).Append(" ");
     7                 sb.Append(m.GetGenericArguments().Length).Append(" ");
     8 
     9                 foreach (var p in m.GetParameters())
    10                 {
    11                     sb.Append(p.ParameterType.ToString()).Append(" ");
    12                 }
    13                 return sb.ToString();
    14 }
    View Code

    结构体

    结果正确:1

    容易引入JSB:1

     1 public class Program
     2 {
     3     struct A
     4     {
     5         public int v;
     6     }
     7     static void Test(A a)
     8     {
     9         a.v = 4;
    10     }
    11     public static void Main()
    12     {
    13         A a = new A();
    14         a.v = 5;
    15         Test(a);
    16         Console.WriteLine(a.v);
    17     }
    18 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         statics: {
     9             test: function (a) {
    10                 a.v = 4;
    11             }
    12         },
    13         $main: function () {
    14             var a = new Demo.Program.A();
    15             a.v = 5;
    16             Demo.Program.test(a.$clone());
    17             Bridge.Console.log(a.v);
    18         }
    19     });
    20 
    21     Bridge.define("Demo.Program.A", {
    22         $kind: "struct",
    23         statics: {
    24             getDefaultValue: function () { return new Demo.Program.A(); }
    25         },
    26         v: 0,
    27         ctor: function () {
    28             this.$initialize();
    29         },
    30         getHashCode: function () {
    31             var h = Bridge.addHash([65, this.v]);
    32             return h;
    33         },
    34         equals: function (o) {
    35             if (!Bridge.is(o, Demo.Program.A)) {
    36                 return false;
    37             }
    38             return Bridge.equals(this.v, o.v);
    39         },
    40         $clone: function (to) {
    41             var s = to || new Demo.Program.A();
    42             s.v = this.v;
    43             return s;
    44         }
    45     });
    46 });
    View Code
    1 5
    View Code

    is/as

    结果正确:1

    容易引入JSB:1

     1 public class Program
     2 {
     3     class A{}
     4     class B{}
     5     static void Test(object obj)
     6     {
     7         Console.WriteLine((obj is A).ToString());
     8         Console.WriteLine((obj is B).ToString());
     9         Console.WriteLine(((obj as A) != null).ToString());
    10         Console.WriteLine(((obj as B) != null).ToString());
    11     }
    12     public static void Main()
    13     {
    14         A a = new A();
    15         Test(a);
    16     }
    17 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         statics: {
     9             test: function (obj) {
    10                 Bridge.Console.log(System.Boolean.toString((Bridge.is(obj, Demo.Program.A))));
    11                 Bridge.Console.log(System.Boolean.toString((Bridge.is(obj, Demo.Program.B))));
    12                 Bridge.Console.log(System.Boolean.toString(((Bridge.as(obj, Demo.Program.A)) != null)));
    13                 Bridge.Console.log(System.Boolean.toString(((Bridge.as(obj, Demo.Program.B)) != null)));
    14             }
    15         },
    16         $main: function () {
    17             var a = new Demo.Program.A();
    18             Demo.Program.test(a);
    19         }
    20     });
    21 
    22     Bridge.define("Demo.Program.A");
    23 
    24     Bridge.define("Demo.Program.B");
    25 });
    View Code
    1 True
    2 False
    3 True
    4 False
    View Code

    协程

    结果正确:0

    容易引入JSB:0

     1 public class Program
     2 {
     3     static IEnumerator Test()
     4     {
     5         yield return 100;
     6         Console.WriteLine(1);
     7         yield return 200;
     8         Console.WriteLine(2);
     9         yield return 300;
    10         Console.WriteLine(3);
    11         yield return 400;
    12         Console.WriteLine(4);
    13     }
    14     public static void Main()
    15     {
    16         IEnumerator ie = Test();
    17         while (ie.MoveNext())
    18         {
    19             Console.WriteLine("Current = " + ie.Current);
    20         }
    21     }
    22 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         statics: {
     9             test: function () {
    10                 var $yield = [];
    11                 $yield.push(100);
    12                 Bridge.Console.log(1);
    13                 $yield.push(200);
    14                 Bridge.Console.log(2);
    15                 $yield.push(300);
    16                 Bridge.Console.log(3);
    17                 $yield.push(400);
    18                 Bridge.Console.log(4);
    19                 return System.Array.toEnumerator($yield);
    20             }
    21         },
    22         $main: function () {
    23             var ie = Demo.Program.test();
    24             while (ie.System$Collections$IEnumerator$moveNext()) {
    25                 Bridge.Console.log(System.String.concat("Current = ", ie.System$Collections$IEnumerator$getCurrent()));
    26             }
    27         }
    28     });
    29 });
    View Code
     1 // 错误输出!
     2 
     3 1
     4 2
     5 3
     6 4
     7 Current = 100
     8 Current = 200
     9 Current = 300
    10 Current = 400
    View Code
     1 // 正确输出!
     2 
     3 Current = 100
     4 1
     5 Current = 200
     6 2
     7 Current = 300
     8 3
     9 Current = 400
    10 4
    View Code

     抢救办法(同当前JSB的做法):

     1 Bridge = {
     2     Console: {
     3         log: function (msg) {
     4             print(msg);
     5         }
     6     }
     7 }
     8 
     9 var statics = {
    10     test: function* () {
    11 
    12        yield (100);
    13        Bridge.Console.log(1);
    14        yield (200);
    15        Bridge.Console.log(2);
    16        yield (300);
    17        Bridge.Console.log(3);
    18        yield (400);
    19        Bridge.Console.log(4);
    20 
    21     }
    22 };
    23 
    24 var p = statics.test();
    25 while (true) {
    26     var obj = p.next();
    27     if (obj.done) {
    28         break;
    29     }
    30     print(obj.value);
    31 }
    View Code

     泛型

    64位整数

    结果正确:1

    容易引入JSB:? 可能需要包装成字符串

    1 public class Program
    2 {
    3     public static void Main()
    4     {
    5         long l = 1152921504606846976L;
    6         Console.WriteLine(l.ToString());
    7     }
    8 }
    View Code
     1 /**
     2  * @compiler Bridge.NET 15.3.0
     3  */
     4 Bridge.assembly("Demo", function ($asm, globals) {
     5     "use strict";
     6 
     7     Bridge.define("Demo.Program", {
     8         $main: function () {
     9             var l = System.Int64([0,268435456]);
    10             Bridge.Console.log(l.toString());
    11         }
    12     });
    13 });
    View Code
    1 1152921504606846976
    View Code

     

    编译时能否引用其他dll

    可以吗:不可以,跟 duocode 一样

    可以处理吗?可以,给 UnityEngine.dll 做壳

     

    Bridge默认把函数名首字母改成了小写

    可以处理吗?可以,bridge.json 里加入 "preserveMemberCase": true

     

    Bridge.js里有一些跟浏览器相关的代码

    搜索 navigator

    todo

    需要判断Bridge.js已经支持哪些类,如果他已经支持,需要可以选择使用c#版还是使用js版

    todo

     

    // finish list

    property命名:getXXX, setXXX

    泛型函数后缀:无(sharpkit后缀$1 $2)

    泛型函数泛型参数:放前面传进去(跟sharpkit一样)

    泛型函数类型传递给C#:Bridge.Reflection.getTypeFullName(t0)

    params处理:无需处理,他自己传递了数组

    Indexer:getItem 或 getItem$1 或 getItem$2

    Operator:一样

    继承格式

    interface

    导出枚举

    暂时去掉JS Vector2 Vector3 Vector4 实现

     inherits 如果是 System.Object,忽略

    field get/set 处理
    JSGenerator 里 lstNames 是什么 用于输出都导出哪些了。删了
    cs导出,参数是数组,代码不好看

    IsInheritanceRel

    64位整数拆分

    JSBindingSettings放到editor下
    导出的类和Bridge已有的类 2者的关系如何处理?--如果bridge有,就不能导出
    协程
    导出System.DateTime不行,因为他的interface找不到 - it'ok
    Bridge工程生成js文件有一部分是不要的,如何去除?--csw.cs, csw.js
    hashtable 导出后,加载 Gen1 发生错误--ok,排序有问题,interface排到hashtable后面去了

    结构体问题:Bridge对结构体参数会先$clone一份,我们的处理是,对于导出的结构体,不要$clone,即$clone简单返回this。

    // ignore list

    生成的外壳代码需要加sealed(除了MonoBehaviour 和 interface)

    不支持yield break

     

    // todo list

    System.Object UnityEngine.Object js Object

    Cs 导出后一些 Manual-JS - 没处理完全

    Bridge.assembly要看js代码,是否需要?

    Bridge.assembly("Demo1", function ($asm, globals) {........});

     Bridge 的匿名函数处理好像很奇怪?

     jscomponent 怎么处理

     

    // 测试列表

    协程 ok

    静态构造函数 ok

    http://www.cnblogs.com/answerwinner/p/4478735.html 中第17条 ok

    泛型类、泛型函数 ok

    js List 试用 ok

    js 使用 c# 带 ref/out 参数的函数 ok

    js 使用 c# 带 params 参数的函数

     

    // 特殊

    1. 如果在Bridge工程添加文件,之后需要手动把对System.dll的引用去掉

    2.

  • 相关阅读:
    Andorid自定义attr的各种坑
    git 使用那些事儿
    Gradle task
    他们要消失了吗?探访人工智能浪潮下的鉴黄师
    测试环境docker化—容器集群编排实践
    测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作
    后台服务项目的白盒测试之旅
    利用反向代理测应用的流量
    CCF 201312-5 I’m stuck! (暴力,BFS)
    CodeForces 709C Letters Cyclic Shift (水题)
  • 原文地址:https://www.cnblogs.com/answerwinner/p/5999902.html
Copyright © 2020-2023  润新知