ILGenerator: Как использовать неуправляемые указатели? (Я получаю VerificationException) - PullRequest
6 голосов
/ 25 ноября 2011

Я делаю программу синтеза звука, в которой пользователь может создавать свои собственные звуки, создавая композицию на основе узлов, создавая генераторы, фильтры и т. Д. *

Программа компилирует узлы на промежуточный язык.который затем преобразуется в 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);

1 Ответ

5 голосов
/ 25 ноября 2011

Если вы передаете ManifestModule исполняющей сборки в качестве 4-го параметра конструктору DynamicMethod, он будет работать так, как задумано:

DynamicMethod M = new DynamicMethod(
    "HiThere",
    ReturnType, Args,
    Assembly.GetExecutingAssembly().ManifestModule);

(Кредит: http://srstrong.blogspot.com/2008/09/unsafe-code-without-unsafe-keyword.html)

...