6

ユーザーがノードベースの合成、オシレーター、フィルターなどの作成を行って独自のサウンドを作成できるサウンド合成プログラムを作成しています。

プログラムはノードを中間言語にコンパイルし、その後 ILGenerator と DynamicMethod を介して MSIL に変換します。

すべての操作とデータが格納されている配列で動作しますが、後でビットレベルの操作を実行できるようにポインターを使用できれば、より高速になります。

PD: スピードは非常に重要です。

DynamicMethod コンストラクターのオーバーライドの 1 つにメソッド属性があり、その 1 つが UnsafeExport であることに気付きましたが、有効な組み合わせは Public+Static のみであるため、使用できません。

これは、VerificationException をスローする私がやろうとしていることです: (ポインターに値を割り当てるためだけに)

//Testing delegate
unsafe delegate float TestDelegate(float* data);

//Inside the test method (which is marked as unsafe) 

        Type ReturnType = typeof(float);
        Type[] Args = new Type[] { typeof(float*) };

        //Can't use UnamangedExport as method attribute:
        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);
4

1 に答える 1

6

実行中のアセンブリ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 )

于 2011-11-25T09:58:42.357 に答える