public static void SwapMethodBody(Type cls, int methodtoken, IntPtr rgIL, int methodSize, int flags)
{
if (methodSize <= 0 || methodSize >= 4128768)
{
throw new ArgumentException(Environment.GetResourceString("Argument_BadSizeForData"), "methodSize");
}
if (cls == null)
{
throw new ArgumentNullException("cls");
}
Module module = cls.Module;
ModuleBuilder moduleBuilder = module as ModuleBuilder;
InternalModuleBuilder internalModuleBuilder;
if (moduleBuilder != null)
{
internalModuleBuilder = moduleBuilder.InternalModule;
}
else
{
internalModuleBuilder = (module as InternalModuleBuilder);
}
if (internalModuleBuilder == null)
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_NotDynamicModule"));
}
RuntimeType runtimeType;
if (cls is TypeBuilder)
{
TypeBuilder typeBuilder = (TypeBuilder)cls;
if (!typeBuilder.IsCreated())
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_NotAllTypesAreBaked", new object[]
{
typeBuilder.Name
}));
}
runtimeType = typeBuilder.BakedRuntimeType;
}
else
{
runtimeType = (cls as RuntimeType);
}
if (runtimeType == null)
{
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"), "cls");
}
StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
RuntimeAssembly runtimeAssembly = internalModuleBuilder.GetRuntimeAssembly();
object syncRoot = runtimeAssembly.SyncRoot;
lock (syncRoot)
{
MethodRental.SwapMethodBody(runtimeType.GetTypeHandleInternal(), methodtoken, rgIL, methodSize, flags, JitHelpers.GetStackCrawlMarkHandle(ref stackCrawlMark));
}
}