Я делаю программу синтеза звука, в которой пользователь может создавать свои собственные звуки, создавая композицию на основе узлов, создавая генераторы, фильтры и т. Д. *
Программа компилирует узлы на промежуточный язык.который затем преобразуется в MSIL через ILGenerator и DynamicMethod
. Он работает с массивом, в котором хранятся все операции и данные, но будет быстрее, если я смог использовать указатели, чтобы я мог сделать некоторыеоперации на уровне битов позже
PD: скорость очень важна !!
Я заметил, что у одного переопределения конструктора DynamicMethod есть атрибут метода, который является UnsafeExport, но я не могу его использовать,потому что единственная допустимая комбинация - Public + Static
Это то, что я пытаюсь сделать, которое выдает мне исключение VerificationException: (просто для присвоения значения указателю)
//Testing delegate
unsafe delegate float TestDelegate(float* data);
//Inside the test method (wich is marked as unsafe)
Type ReturnType = typeof(float);
Type[] Args = new Type[] { typeof(float*) };
//Can't use UnamangedExport as method atribute:
DynamicMethod M = new DynamicMethod(
"HiThere",
ReturnType, Args);
ILGenerator Gen = M.GetILGenerator();
//Set the pointer value to 7.0:
Gen.Emit(OpCodes.Ldarg_0);
Gen.Emit(OpCodes.Ldc_R4, 7F);
Gen.Emit(OpCodes.Stind_R4);
//Just return a dummy value:
Gen.Emit(OpCodes.Ldc_R4, 20F);
Gen.Emit(OpCodes.Ret);
var del = (TestDelegate)M.CreateDelegate(typeof(TestDelegate));
float* data = (float*)Marshal.AllocHGlobal(4);
//VerificationException thrown here:
float result = del(data);