Skip to content

Commit 603a9a5

Browse files
authored
Merge branch 'focus-creative-games:main' into main
2 parents 47e282a + fca130b commit 603a9a5

27 files changed

Lines changed: 296 additions & 364 deletions

Data~/hybridclr_version.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,38 @@
22
"versions": [
33
{
44
"unity_version":"2019",
5-
"hybridclr" : { "branch":"v7.8.1"},
6-
"il2cpp_plus": { "branch":"v2019-7.8.0"}
5+
"hybridclr" : { "branch":"v8.0.0"},
6+
"il2cpp_plus": { "branch":"v2019-8.1.0"}
77
},
88
{
99
"unity_version":"2020",
10-
"hybridclr" : { "branch":"v7.8.1"},
11-
"il2cpp_plus": { "branch":"v2020-7.8.0"}
10+
"hybridclr" : { "branch":"v8.0.0"},
11+
"il2cpp_plus": { "branch":"v2020-8.1.0"}
1212
},
1313
{
1414
"unity_version":"2021",
15-
"hybridclr" : { "branch":"v7.8.1"},
16-
"il2cpp_plus": { "branch":"v2021-7.8.0"}
15+
"hybridclr" : { "branch":"v8.0.0"},
16+
"il2cpp_plus": { "branch":"v2021-8.1.0"}
1717
},
1818
{
1919
"unity_version":"2022",
20-
"hybridclr" : { "branch":"v7.8.1"},
21-
"il2cpp_plus": { "branch":"v2022-7.8.0"}
20+
"hybridclr" : { "branch":"v8.0.0"},
21+
"il2cpp_plus": { "branch":"v2022-8.1.0"}
2222
},
2323
{
2424
"unity_version":"2022-tuanjie",
25-
"hybridclr" : { "branch":"v7.8.1"},
26-
"il2cpp_plus": { "branch":"v2022-tuanjie-7.8.0"}
25+
"hybridclr" : { "branch":"v8.0.0"},
26+
"il2cpp_plus": { "branch":"v2022-tuanjie-8.1.0"}
2727
},
2828
{
2929
"unity_version":"2023",
30-
"hybridclr" : { "branch":"v7.8.1"},
31-
"il2cpp_plus": { "branch":"v2023-7.8.0"}
30+
"hybridclr" : { "branch":"v8.0.0"},
31+
"il2cpp_plus": { "branch":"v2023-8.1.0"}
3232
},
3333
{
3434
"unity_version":"6000",
35-
"hybridclr" : { "branch":"v7.8.1"},
36-
"il2cpp_plus": { "branch":"v6000-7.9.0"}
35+
"hybridclr" : { "branch":"v8.0.0"},
36+
"il2cpp_plus": { "branch":"v6000-8.1.0"}
3737
}
3838
]
3939
}

Editor/Commands/CompileDllCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static void CompileDll(string buildDir, BuildTarget target, bool developm
3030

3131
public static void CompileDll(BuildTarget target)
3232
{
33-
CompileDll(EditorUserBuildSettings.activeBuildTarget, EditorUserBuildSettings.development);
33+
CompileDll(target, EditorUserBuildSettings.development);
3434
}
3535

3636
public static void CompileDll(BuildTarget target, bool developmentBuild)

Editor/Commands/MethodBridgeGeneratorCommand.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using HybridCLR.Editor.ABI;
33
using HybridCLR.Editor.Meta;
44
using HybridCLR.Editor.MethodBridge;
5-
using HybridCLR.Editor.ReversePInvokeWrap;
65
using System;
76
using System.Collections.Generic;
87
using System.IO;
@@ -31,7 +30,7 @@ public static void CleanIl2CppBuildCache()
3130
Directory.Delete(il2cppBuildCachePath, true);
3231
}
3332

34-
private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawReversePInvokeMethodInfo> reversePInvokeMethods, IReadOnlyCollection<RawCalliMethodSignatureInfo> calliMethodSignatures, string tempFile, string outputFile)
33+
private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawMonoPInvokeCallbackMethodInfo> reversePInvokeMethods, IReadOnlyCollection<CallNativeMethodSignatureInfo> calliMethodSignatures, string tempFile, string outputFile)
3534
{
3635
string templateCode = File.ReadAllText(tempFile, Encoding.UTF8);
3736
var g = new Generator(new Generator.Options()
@@ -78,16 +77,20 @@ public static void GenerateMethodBridgeAndReversePInvokeWrapper(BuildTarget targ
7877
List<string> hotUpdateDlls = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;
7978
var cache = new AssemblyCache(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDlls));
8079

81-
var reversePInvokeAnalyzer = new ReversePInvokeWrap.Analyzer(cache, hotUpdateDlls);
80+
var reversePInvokeAnalyzer = new MonoPInvokeCallbackAnalyzer(cache, hotUpdateDlls);
8281
reversePInvokeAnalyzer.Run();
8382

8483
var calliAnalyzer = new CalliAnalyzer(cache, hotUpdateDlls);
8584
calliAnalyzer.Run();
85+
var pinvokeAnalyzer = new PInvokeAnalyzer(cache, hotUpdateDlls);
86+
pinvokeAnalyzer.Run();
87+
var callPInvokeMethodSignatures = pinvokeAnalyzer.PInvokeMethodSignatures;
8688

8789
string templateFile = $"{SettingsUtil.TemplatePathInPackage}/MethodBridge.cpp.tpl";
8890
string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge.cpp";
8991

90-
GenerateMethodBridgeCppFile(methodBridgeAnalyzer.GenericMethods, reversePInvokeAnalyzer.ReversePInvokeMethods, calliAnalyzer.CalliMethodSignatures, templateFile, outputFile);
92+
var callNativeMethodSignatures = calliAnalyzer.CalliMethodSignatures.Concat(pinvokeAnalyzer.PInvokeMethodSignatures).ToList();
93+
GenerateMethodBridgeCppFile(methodBridgeAnalyzer.GenericMethods, reversePInvokeAnalyzer.ReversePInvokeMethods, callNativeMethodSignatures, templateFile, outputFile);
9194

9295
CleanIl2CppBuildCache();
9396
}

Editor/Commands/StripAOTDllCommand.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,6 @@ public static void GenerateStripedAOTDlls(BuildTarget target)
7272
BashUtil.RemoveDir(outputPath);
7373

7474
var buildOptions = GetBuildPlayerOptions(target);
75-
#if UNITY_2021_2_OR_NEWER
76-
buildOptions |= BuildOptions.CleanBuildCache;
77-
#endif
7875

7976
bool oldExportAndroidProj = EditorUserBuildSettings.exportAsGoogleAndroidProject;
8077
#if UNITY_EDITOR_OSX

Editor/Link/LinkXmlWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace HybridCLR.Editor.Link
1111
{
12-
internal class LinkXmlWriter
12+
public class LinkXmlWriter
1313
{
1414
public void Write(string outputLinkXmlFile, HashSet<TypeRef> refTypes)
1515
{

Editor/Meta/FixedSetAssemblyResolver.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ protected override bool TryResolveAssembly(string assemblyName, out string assem
2929
Debug.Log($"[FixedSetAssemblyResolver] resolve:{assemblyName} path:{assemblyPath}");
3030
return true;
3131
}
32+
assemblyPath = $"{_rootDir}/{assemblyName}.dll.bytes";
33+
if (File.Exists(assemblyPath))
34+
{
35+
Debug.Log($"[FixedSetAssemblyResolver] resolve:{assemblyName} path:{assemblyPath}");
36+
return true;
37+
}
3238
}
3339
assemblyPath = null;
3440
return false;

Editor/Meta/GenericArgumentContext.cs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,18 @@
77

88
namespace HybridCLR.Editor.Meta
99
{
10-
/// <summary>
11-
/// Replaces generic type/method var with its generic argument
12-
/// </summary>
13-
public sealed class GenericArgumentContext
10+
11+
public class GenericArgumentContext
1412
{
15-
List<TypeSig> typeArgsStack = new List<TypeSig>();
16-
List<TypeSig> methodArgsStack = new List<TypeSig>();
13+
private readonly List<TypeSig> typeArgsStack;
14+
private readonly List<TypeSig> methodArgsStack;
1715

1816
public GenericArgumentContext(List<TypeSig> typeArgsStack, List<TypeSig> methodArgsStack)
1917
{
2018
this.typeArgsStack = typeArgsStack;
2119
this.methodArgsStack = methodArgsStack;
2220
}
2321

24-
25-
26-
/// <summary>
27-
/// Replaces a generic type/method var with its generic argument (if any). If
28-
/// <paramref name="typeSig"/> isn't a generic type/method var or if it can't
29-
/// be resolved, it itself is returned. Else the resolved type is returned.
30-
/// </summary>
31-
/// <param name="typeSig">Type signature</param>
32-
/// <returns>New <see cref="TypeSig"/> which is never <c>null</c> unless
33-
/// <paramref name="typeSig"/> is <c>null</c></returns>
3422
public TypeSig Resolve(TypeSig typeSig)
3523
{
3624
if (!typeSig.ContainsGenericParameter)
@@ -41,9 +29,9 @@ public TypeSig Resolve(TypeSig typeSig)
4129
switch (typeSig.ElementType)
4230
{
4331
case ElementType.Ptr: return new PtrSig(Resolve(typeSig.Next));
44-
case ElementType.ByRef: return new PtrSig(Resolve(typeSig.Next));
32+
case ElementType.ByRef: return new ByRefSig(Resolve(typeSig.Next));
4533

46-
case ElementType.SZArray: return new PtrSig(Resolve(typeSig.Next));
34+
case ElementType.SZArray: return new SZArraySig(Resolve(typeSig.Next));
4735
case ElementType.Array:
4836
{
4937
var ara = (ArraySig)typeSig;
@@ -53,7 +41,7 @@ public TypeSig Resolve(TypeSig typeSig)
5341
case ElementType.Var:
5442
{
5543
GenericVar genericVar = (GenericVar)typeSig;
56-
var newSig = Resolve(typeArgsStack, genericVar.Number, true);
44+
var newSig = Resolve(typeArgsStack, genericVar.Number);
5745
if (newSig == null)
5846
{
5947
throw new Exception();
@@ -64,7 +52,7 @@ public TypeSig Resolve(TypeSig typeSig)
6452
case ElementType.MVar:
6553
{
6654
GenericMVar genericVar = (GenericMVar)typeSig;
67-
var newSig = Resolve(methodArgsStack, genericVar.Number, true);
55+
var newSig = Resolve(methodArgsStack, genericVar.Number);
6856
if (newSig == null)
6957
{
7058
throw new Exception();
@@ -113,13 +101,9 @@ public TypeSig Resolve(TypeSig typeSig)
113101
}
114102
}
115103

116-
private TypeSig Resolve(List<TypeSig> args, uint number, bool isTypeVar)
104+
private TypeSig Resolve(List<TypeSig> args, uint number)
117105
{
118-
var typeSig = args[(int)number];
119-
var gvar = typeSig as GenericSig;
120-
if (gvar is null || gvar.IsTypeVar != isTypeVar)
121-
return typeSig;
122-
return gvar;
106+
return args[(int)number];
123107
}
124108
}
125109

Editor/Meta/MetaUtil.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public static TypeSig ToShareTypeSig(ICorLibTypes corTypes, TypeSig typeSig)
122122
}
123123
return new GenericInstSig(gia.GenericType, gia.GenericArguments.Select(ga => ToShareTypeSig(corTypes, ga)).ToList());
124124
}
125-
case ElementType.FnPtr: return corTypes.IntPtr;
125+
case ElementType.FnPtr: return corTypes.UIntPtr;
126126
case ElementType.ValueArray: return typeSig;
127127
case ElementType.Module: return typeSig;
128128
default:
@@ -189,5 +189,29 @@ public static List<TypeSig> CreateDefaultGenericParams(ModuleDef module, int ge
189189
}
190190
return methodGenericParams;
191191
}
192+
193+
public static bool IsSupportedPInvokeTypeSig(TypeSig typeSig)
194+
{
195+
typeSig = typeSig.RemovePinnedAndModifiers();
196+
if (typeSig.IsByRef)
197+
{
198+
return true;
199+
}
200+
switch (typeSig.ElementType)
201+
{
202+
case ElementType.SZArray:
203+
case ElementType.Array:
204+
//case ElementType.Class:
205+
case ElementType.String:
206+
//case ElementType.Object:
207+
return false;
208+
default: return true;
209+
}
210+
}
211+
212+
public static bool IsSupportedPInvokeMethodSignature(MethodSig methodSig)
213+
{
214+
return IsSupportedPInvokeTypeSig(methodSig.RetType) && methodSig.Params.All(p => IsSupportedPInvokeTypeSig(p));
215+
}
192216
}
193217
}

Editor/Meta/PathAssemblyResolver.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@ protected override bool TryResolveAssembly(string assemblyName, out string assem
2020
{
2121
foreach(var path in _searchPaths)
2222
{
23-
string assPath = Path.Combine(path, assemblyName + ".dll");
24-
if (File.Exists(assPath))
23+
assemblyPath = Path.Combine(path, $"{assemblyName}.dll");
24+
if (File.Exists(assemblyPath))
2525
{
26-
Debug.Log($"resolve {assemblyName} at {assPath}");
27-
assemblyPath = assPath;
26+
Debug.Log($"resolve {assemblyName} at {assemblyPath}");
27+
return true;
28+
}
29+
assemblyPath = Path.Combine(path, $"{assemblyName}.dll.bytes");
30+
if (File.Exists(assemblyPath))
31+
{
32+
Debug.Log($"resolve {assemblyName} at {assemblyPath}");
2833
return true;
2934
}
3035
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using dnlib.DotNet;
2+
3+
namespace HybridCLR.Editor.MethodBridge
4+
{
5+
public class CallNativeMethodSignatureInfo
6+
{
7+
public MethodSig MethodSig { get; set; }
8+
}
9+
}

0 commit comments

Comments
 (0)