c# - Getting a "Common Language Runtime detected an invalid program." error when trying to map ReadUnaligned using DynamicMethod and ILGenerator
问题描述
I'm trying to map the IL code for ASP.CORE method ReadUnaligned as defined here in .NET Frameword using DynamicMethod following this example.
When trying to run the code, I get the "Common Language Runtime detected an invalid program." error.
My code:
private delegate T ReadUnalignedInvoker<T>(ref byte input);
private delegate TReturn OneParameter<TReturn, TParameter0>(TParameter0 p0);
public static T ReadUnaligned<T, U>(U source)
{
Type[] methodArgsTypes = { typeof(U) };
var dm = new DynamicMethod("ReadUnaligned", typeof(T), methodArgsTypes, typeof(SizeHelper).Module);
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Unaligned, (byte)0x1);
il.Emit(OpCodes.Ldobj);
il.Emit(OpCodes.Ret);
OneParameter<T, U> invoker = (OneParameter<T, U>)dm.CreateDelegate(typeof(OneParameter<T, U>));
return invoker(source);
}
The call to the method is:
var buffer = new byte[Unsafe.SizeOf<TStructure>()];
ReadProcessMemory(_processHandle, baseAddress, ref buffer[0], buffer.Length, out var numberOfBytesRead);
ReadUnaligned<TStructure, byte>(buffer[0]);
Where ReadProcessMemory is taken from kernel32.dll
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool ReadProcessMemory(SafeProcessHandle processHandle, IntPtr baseAddress, ref byte buffer, int bufferSize, out int numberOfBytesRead);
Any idea what I'm doing wrong?
解决方案
推荐阅读
- android - 由于无效原因,我的应用被 Instagram Basic Display API 审核拒绝
- laravel-6 - 在 Laravel 中删除或导出一个完整的模块
- python - 如何在函数中定义模型的名称
- google-compute-engine - 谷歌云计算没有剩余存储空间
- apache-kafka - 使用 Confluent Replicator 在每个分区中进行排序保证
- python - 如何仅提取一个值的值以及字典中的键?
- git - 定义一个自定义的 git 远程
- java - 在休眠查询中无法在搜索过程中加载列表
- javascript - Chart.js 中图表的默认颜色在哪里定义?
- javascript - gmail javascript库的`window.gapi`不起作用