Skip to content

Commit 213a11f

Browse files
committed
[new] generate Managed2NativeFunction for PInvoke method
1 parent 585be97 commit 213a11f

3 files changed

Lines changed: 63 additions & 2 deletions

File tree

Editor/Commands/MethodBridgeGeneratorCommand.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static void CleanIl2CppBuildCache()
3131
Directory.Delete(il2cppBuildCachePath, true);
3232
}
3333

34-
private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawReversePInvokeMethodInfo> reversePInvokeMethods, IReadOnlyCollection<RawCalliMethodSignatureInfo> calliMethodSignatures, string tempFile, string outputFile)
34+
private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawReversePInvokeMethodInfo> reversePInvokeMethods, IReadOnlyCollection<CallNativeMethodSignatureInfo> calliMethodSignatures, string tempFile, string outputFile)
3535
{
3636
string templateCode = File.ReadAllText(tempFile, Encoding.UTF8);
3737
var g = new Generator(new Generator.Options()
@@ -83,11 +83,15 @@ public static void GenerateMethodBridgeAndReversePInvokeWrapper(BuildTarget targ
8383

8484
var calliAnalyzer = new CalliAnalyzer(cache, hotUpdateDlls);
8585
calliAnalyzer.Run();
86+
var pinvokeAnalyzer = new PInvokeAnalyzer(cache, hotUpdateDlls);
87+
pinvokeAnalyzer.Run();
88+
var callPInvokeMethodSignatures = pinvokeAnalyzer.PInvokeMethodSignatures;
8689

8790
string templateFile = $"{SettingsUtil.TemplatePathInPackage}/MethodBridge.cpp.tpl";
8891
string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge.cpp";
8992

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

9296
CleanIl2CppBuildCache();
9397
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using dnlib.DotNet;
2+
using HybridCLR.Editor.Meta;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using UnityEngine;
9+
10+
namespace HybridCLR.Editor.MethodBridge
11+
{
12+
13+
public class PInvokeAnalyzer
14+
{
15+
private readonly List<ModuleDefMD> _rootModules = new List<ModuleDefMD>();
16+
17+
private readonly List<CallNativeMethodSignatureInfo> _pinvokeMethodSignatures = new List<CallNativeMethodSignatureInfo>();
18+
19+
public List<CallNativeMethodSignatureInfo> PInvokeMethodSignatures => _pinvokeMethodSignatures;
20+
21+
public PInvokeAnalyzer(AssemblyCache cache, List<string> assemblyNames)
22+
{
23+
foreach (var assemblyName in assemblyNames)
24+
{
25+
_rootModules.Add(cache.LoadModule(assemblyName));
26+
}
27+
}
28+
29+
public void Run()
30+
{
31+
foreach (var mod in _rootModules)
32+
{
33+
foreach (TypeDef type in mod.GetTypes())
34+
{
35+
foreach (MethodDef method in type.Methods)
36+
{
37+
if (method.IsPinvokeImpl)
38+
{
39+
_pinvokeMethodSignatures.Add(new CallNativeMethodSignatureInfo { MethodSig = method.MethodSig });
40+
}
41+
}
42+
}
43+
}
44+
}
45+
}
46+
}

Editor/MethodBridge/PInvokeAnalyzer.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)