本文整理汇总了C#中TypeBuilder.PrepareType方法的典型用法代码示例。如果您正苦于以下问题:C# TypeBuilder.PrepareType方法的具体用法?C# TypeBuilder.PrepareType怎么用?C# TypeBuilder.PrepareType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TypeBuilder
的用法示例。
在下文中一共展示了TypeBuilder.PrepareType方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Prepare
//.........这里部分代码省略.........
if (foundAddressType == TypeLoaderEnvironment.MethodAddressType.Canonical ||
foundAddressType == TypeLoaderEnvironment.MethodAddressType.UniversalCanonical)
{
// Cache the resolved canonical / universal pointer in the MethodDesc
// Actually it would simplify matters here if the MethodDesc held just one pointer
// and the lookup type enumeration value.
Method.SetFunctionPointer(
addressToUse,
foundAddressType == TypeLoaderEnvironment.MethodAddressType.UniversalCanonical);
}
}
// Look at the resolution type and check whether we can set up the ExactFunctionPointer upfront
switch (foundAddressType)
{
case TypeLoaderEnvironment.MethodAddressType.Exact:
_exactFunctionPointer = addressToUse;
break;
case TypeLoaderEnvironment.MethodAddressType.Canonical:
{
bool methodRequestedIsCanonical = Method.IsCanonicalMethod(CanonicalFormKind.Specific);
bool requestedMethodNeedsDictionaryWhenCalledAsCanonical = NeedsDictionaryParameterToCallCanonicalVersion(Method);
if (!requestedMethodNeedsDictionaryWhenCalledAsCanonical || methodRequestedIsCanonical)
{
_exactFunctionPointer = addressToUse;
}
break;
}
case TypeLoaderEnvironment.MethodAddressType.UniversalCanonical:
{
if (Method.IsCanonicalMethod(CanonicalFormKind.Specific) &&
!NeedsDictionaryParameterToCallCanonicalVersion(Method) &&
!TypeLoaderEnvironment.MethodSignatureHasVarsNeedingCallingConventionConverter_MethodSignature(
Method.GetTypicalMethodDefinition().Signature))
{
_exactFunctionPointer = addressToUse;
}
break;
}
default:
Environment.FailFast("Unexpected method address type");
return;
}
if (_exactFunctionPointer == IntPtr.Zero)
{
// We have exhausted exact resolution options so we must resort to calling
// convention conversion. Prepare the type parameters of the method so that
// the calling convention converter can have RuntimeTypeHandle's to work with.
// For canonical methods, convert paramters to their CanonAlike form
// as the Canonical RuntimeTypeHandle's are not permitted to exist.
Debug.Assert(!Method.IsCanonicalMethod(CanonicalFormKind.Universal));
bool methodRequestedIsCanonical = Method.IsCanonicalMethod(CanonicalFormKind.Specific);
MethodDesc canonAlikeForm;
if (methodRequestedIsCanonical)
{
canonAlikeForm = Method.ReplaceTypesInConstructionOfMethod(Method.Context.CanonTypeArray, Method.Context.CanonAlikeTypeArray);
}
else
{
canonAlikeForm = Method;
}
foreach (TypeDesc t in canonAlikeForm.Instantiation)
{
builder.PrepareType(t);
}
foreach (TypeDesc t in canonAlikeForm.OwningType.Instantiation)
{
builder.PrepareType(t);
}
if (!(Method.GetTypicalMethodDefinition() is RuntimeMethodDesc))
{
// Also, prepare all of the argument types as will be needed by the calling convention converter
MethodSignature signature = canonAlikeForm.Signature;
for (int i = 0; i < signature.Length; i++)
{
TypeDesc t = signature[i];
if (t is ByRefType)
builder.PrepareType(((ByRefType)t).ParameterType);
else
builder.PrepareType(t);
}
if (signature.ReturnType is ByRefType)
builder.PrepareType((ByRefType)signature.ReturnType);
else
builder.PrepareType(signature.ReturnType);
}
_universalCanonImplementationOfCanonMethod = methodRequestedIsCanonical;
_methodToUseForInstantiatingParameters = canonAlikeForm;
}
}
// By the time we reach here, we should always have a function pointer of some form
Debug.Assert((_exactFunctionPointer != IntPtr.Zero) || (Method.FunctionPointer != IntPtr.Zero) || (Method.UsgFunctionPointer != IntPtr.Zero));
}