[fix] fixed PInvokeAnalyzer bug in computing PInvoke function calling conventions.
parent
0642726469
commit
e36bbb9022
|
|
@ -5,5 +5,7 @@ namespace HybridCLR.Editor.MethodBridge
|
|||
public class CallNativeMethodSignatureInfo
|
||||
{
|
||||
public MethodSig MethodSig { get; set; }
|
||||
|
||||
public CallingConvention? Callvention { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -638,7 +638,7 @@ namespace HybridCLR.Editor.MethodBridge
|
|||
sharedMethod.Init();
|
||||
sharedMethod = ToIsomorphicMethod(sharedMethod);
|
||||
|
||||
CallingConvention callingConv = (CallingConvention)((int)(method.MethodSig.CallingConvention & dnlib.DotNet.CallingConvention.Mask) + 1);
|
||||
CallingConvention callingConv = (CallingConvention)((int)((method.Callvention ?? method.MethodSig.CallingConvention) & dnlib.DotNet.CallingConvention.Mask) + 1);
|
||||
string signature = MakeCalliSignature(sharedMethod, callingConv);
|
||||
|
||||
if (!methodsBySig.TryGetValue(signature, out var arm))
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using HybridCLR.Editor.Meta;
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
|
@ -26,6 +27,19 @@ namespace HybridCLR.Editor.MethodBridge
|
|||
}
|
||||
}
|
||||
|
||||
private CallingConvention GetCallingConvention(MethodDef method)
|
||||
{
|
||||
switch (method.ImplMap.CallConv)
|
||||
{
|
||||
case PInvokeAttributes.CallConvWinapi: return CallingConvention.Default;
|
||||
case PInvokeAttributes.CallConvCdecl: return CallingConvention.C;
|
||||
case PInvokeAttributes.CallConvStdCall: return CallingConvention.StdCall;
|
||||
case PInvokeAttributes.CallConvThiscall: return CallingConvention.ThisCall;
|
||||
case PInvokeAttributes.CallConvFastcall: return CallingConvention.FastCall;
|
||||
default: return CallingConvention.Default;
|
||||
}
|
||||
}
|
||||
|
||||
public void Run()
|
||||
{
|
||||
foreach (var mod in _rootModules)
|
||||
|
|
@ -40,7 +54,11 @@ namespace HybridCLR.Editor.MethodBridge
|
|||
{
|
||||
Debug.LogError($"PInvoke method {method.FullName} has unsupported parameter or return type. Please check the method signature.");
|
||||
}
|
||||
_pinvokeMethodSignatures.Add(new CallNativeMethodSignatureInfo { MethodSig = method.MethodSig });
|
||||
_pinvokeMethodSignatures.Add(new CallNativeMethodSignatureInfo
|
||||
{
|
||||
MethodSig = method.MethodSig,
|
||||
Callvention = method.HasImplMap? GetCallingConvention(method) : (CallingConvention?)null,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue