Skip to content

Commit 0c6d6ee

Browse files
author
liuyunlong
committed
* update README.md
1 parent f68e5d7 commit 0c6d6ee

File tree

9 files changed

+40
-16
lines changed

9 files changed

+40
-16
lines changed

Adapter/glue/Binder.define.cs

Whitespace-only changes.

Adapter/glue/Binder.funcdeser.cs

Whitespace-only changes.

Adapter/glue/Binder.funcser.cs

Whitespace-only changes.

DemoProject/Assets/Plugins/PureScript/Editor/PureScriptBuilder.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,18 @@
1515

1616
public static class PureScriptBuilder
1717
{
18-
public static bool Enable = true;
19-
static string ScriptEngineDir = "../ScriptEngine";
18+
public static bool Enable;
19+
static string ScriptEngineDir;
2020
static bool Inbuild = false;
2121

22+
static PureScriptBuilder()
23+
{
24+
Enable = true;
25+
ScriptEngineDir = "../ScriptEngine";
26+
#if UNITY_ANDROID
27+
Enable = false;
28+
#endif
29+
}
2230

2331

2432
[UnityEditor.Callbacks.PostProcessScene]
Binary file not shown.
Binary file not shown.

DemoProject/Assets/Plugins/x86_64.meta

Lines changed: 0 additions & 8 deletions
This file was deleted.

DemoProject/Assets/Scripts/Lancher/Lancher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class Lancher : MonoBehaviour
1818
void Start()
1919
{
2020
#if UNITY_STANDALONE_WIN
21-
reloadDir = @"F:\Project\UnityBind\PureScript\ScriptEngine\Managed";
21+
reloadDir = @"{path_to_ScriptEngine}\Managed";//C:\xx\PureScript\ScriptEngine\Managed
2222
#else
2323
reloadDir = Path.Combine(Application.persistentDataPath , "Managed");
2424
#endif

README.md

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,23 @@
2929
2. 修改 PureScriptBuilder.cs及ScriptEngine/Tools/config.json中的路径配置。
3030
3. config.json中配置运行在interpreter模式的dll(否则以aot运行),以及运行在Il2cpp运行时内的dll(一般用作Adapter)。
3131

32-
+ iOS平台需要安装[Cocoapods](https://cocoapods.org/)[Ninja](https://ninja-build.org/) 。在项目的podfile内添加PureScript引用。
32+
### iOS平台
33+
iOS平台需要安装[Cocoapods](https://cocoapods.org/)[Ninja](https://ninja-build.org/) 。并在项目的podfile内添加PureScript引用。
3334
例: */iOS/Podfile-example
34-
然后
35+
导出xcode工程,然后
3536

3637
pod install
3738

3839

39-
40-
+ Windows平台仅用来调试,在构建项目后,编译 ScriptEngine/ScriptEngine.vcxproj,替换原来Plugins目录下的的dll,或者导出Il2cpp的工程添加ScriptEngine.vcxproj项目调试运行。
40+
### Windows平台
41+
Windows平台仅用来调试,目前未添加自动集成,在构建项目后,需编译 ScriptEngine/ScriptEngine.vcxproj,替换原来Plugins目录下的的ScriptEngine.dll。
42+
手动调试步骤:
43+
1. 设置传入ScriptEngine.Setup接口的reloadDir路径为 */ScriptEngine/Managed
44+
2. Unity导出VS工程。
45+
3. 需要删除Unity导出目录下的Managed目录例如($(ExportPath)/DemoProject/Managed),否则Mono会默认从此处加载dll,Il2cpp并不会使用此目录,但是每次构建都会导出。
46+
4. 在导出的解决方案中添加ScriptEngine.vcxproj,并在主项目中添加ScriptEngine项目的依赖(方便调试)。
47+
5. 修改ScriptEngine.vcxproj中的输出目录为 $(ExportPath)/build/bin/DemoProject_Data/Plugins/,即替换原本的ScriptEngine.dll。
48+
6. 运行项目
4149

4250

4351
## 例子
@@ -70,7 +78,23 @@ PureScript 封装了Mono运行时,c/csharp代码生成器,pod项目自动集
7078

7179
* Adapter绑定:
7280
由纯CSharp实现,分别在Mono端和Il2cpp端生成绑定代码,具有更好的兼容和灵活性。Mono运行时内的dll调用Il2cpp内的dll时用到,在config.json中配置需要运行在Il2cpp内又需要在Mono内调用的dll,构建时自动生成绑定代码,在aot执行,调用时自动替换到绑定代码,调用方无需修改。
73-
例:DemoProject/*/AdapterTest
81+
例:DemoProject/*/AdapterTest
82+
1. 绑定分两部分,构建时会自动生成Adapter.gen.dll(Il2cpp内执行)和Adapter.wrapper.dll(Mono内执行),生成代码参考:ScriptEngine/Adapter/glue/*.cs。
83+
2. 运行时ScriptEngine.Setup会将需要绑定的接口生成代理对象,然后序列化到非托管内存中,同时将内存指针报错到ScriptEngine中,参考:ScriptEngine.c。
84+
3. Mono运行时启动后,执行Main函数时会首先从ScriptEngine读取内存指针,然后反序列化为代理,供Wrapper调用。
85+
4. Mono运行时内,调用被Adapter绑定过的程序集时会自动指向Adapter.wrapper.dll内的Wrapper实现。
86+
注:代理的序列化与反序列化[参考](https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getfunctionpointerfordelegate)
87+
```
88+
Marshal.GetFunctionPointerForDelegate
89+
Marshal.GetDelegateForFunctionPointer
90+
```
91+
92+
## 自动绑定过程
93+
* 构建Unity项目时PureScriptBuilder.cs内注册了回调,并通过hook的方式分别在`StripAssemblies`前/后添加了绑定调用,此处是要再Il2cpp前将已经`Strip`的Assemblies拷贝出一份,并且进行Adapter绑定的代码生成。
94+
* 第一次绑定调用是做Adapter绑定的代码生成,生产物是Adapter.gen.dll和Adapter.wrapper.dll,这步需要在`Strip`前,否则会触发Il2cpp构建错误。
95+
* 第二次绑定调用是在`Strip`后,此次绑定会将已经`Strip`的Assemblies拷贝出一份。
96+
然后进行icall绑定,生产物是ScriptEngine/generated/*.c
97+
如果是iOS平台,会进行aot构建,首先生成`build.ninja`,然后通过ninja生成ScriptEngine/aot/*.a
7498

7599
----------------------------------
76100

0 commit comments

Comments
 (0)