diff --git a/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.cs b/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.cs new file mode 100644 index 00000000000..1180a2503f6 --- /dev/null +++ b/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.cs @@ -0,0 +1,109 @@ +using System; +using System.Reflection.Metadata; +using System.Reflection.Metadata.Ecma335; +using System.Reflection; + +namespace MethodSignatureSnippets +{ + static class MethodSignatureSnippets + { + // + static BlobBuilder EncodeMethodSignatureParameterless() + { + // void Method() + var methodSignature = new BlobBuilder(); + + new BlobEncoder(methodSignature). + MethodSignature(). + Parameters(0, returnType => returnType.Void(), parameters => { }); + + return methodSignature; + } + + static BlobBuilder EncodeMethodSignaturePrimitiveTypes() + { + // double Method(double x, double y) + var methodSignature = new BlobBuilder(); + + new BlobEncoder(methodSignature). + MethodSignature(). + Parameters(2, returnType => returnType.Type().Double(), + parameters => { + parameters.AddParameter().Type().Double(); + parameters.AddParameter().Type().Double(); + }); + + return methodSignature; + } + + static BlobBuilder EncodeMethodSignatureClassType(MetadataBuilder metadataBuilder) + { + // void Method(System.Threading.Thread x) + var methodSignature = new BlobBuilder(); + + AssemblyReferenceHandle mscorlibAssemblyRef = metadataBuilder.AddAssemblyReference( + name: metadataBuilder.GetOrAddString("System.Threading.Thread"), + version: new Version(4, 0, 0, 0), + culture: default(StringHandle), + publicKeyOrToken: default(BlobHandle), + flags: default(AssemblyFlags), + hashValue: default(BlobHandle)); + + TypeReferenceHandle typeRef = metadataBuilder.AddTypeReference( + mscorlibAssemblyRef, + metadataBuilder.GetOrAddString("System.Threading"), + metadataBuilder.GetOrAddString("Thread")); + + new BlobEncoder(methodSignature). + MethodSignature(). + Parameters(1, returnType => returnType.Void(), + parameters => { + parameters.AddParameter().Type().Type(typeRef, false); + }); + + return methodSignature; + } + + static BlobBuilder EncodeMethodSignatureModifiedTypes() + { + // void Method(ref int x, int[] y) + var methodSignature = new BlobBuilder(); + + new BlobEncoder(methodSignature). + MethodSignature(). + Parameters(2, returnType => returnType.Void(), + parameters => { + parameters.AddParameter().Type(isByRef: true).Int32(); + parameters.AddParameter().Type().SZArray().Int32(); + }); + + return methodSignature; + } + + public static BlobBuilder EncodeMethodSignatureGeneric() + { + // void Method(T x) + var methodSignature = new BlobBuilder(); + + new BlobEncoder(methodSignature). + MethodSignature(genericParameterCount: 1). + Parameters(1, returnType => returnType.Void(), + parameters => { + parameters.AddParameter().Type().GenericMethodTypeParameter(0); + }); + + return methodSignature; + } + // + + public static void Run() + { + var metadataBuilder = new MetadataBuilder(); + EncodeMethodSignatureParameterless(); + EncodeMethodSignaturePrimitiveTypes(); + EncodeMethodSignatureClassType(metadataBuilder); + EncodeMethodSignatureModifiedTypes(); + EncodeMethodSignatureGeneric(); + } + } +} diff --git a/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.csproj b/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.csproj new file mode 100644 index 00000000000..ddb344e65f4 --- /dev/null +++ b/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.csproj @@ -0,0 +1,8 @@ + + + + Exe + net6.0 + + + diff --git a/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/Program.cs b/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/Program.cs new file mode 100644 index 00000000000..be2bfe8bfc9 --- /dev/null +++ b/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace MethodSignatureSnippets +{ + class Program + { + static void Main(string[] args) + { + MethodSignatureSnippets.Run(); + } + } +} diff --git a/xml/System.Reflection.Metadata.Ecma335/BlobEncoder.xml b/xml/System.Reflection.Metadata.Ecma335/BlobEncoder.xml index 37959e0f32a..04f005dc31e 100644 --- a/xml/System.Reflection.Metadata.Ecma335/BlobEncoder.xml +++ b/xml/System.Reflection.Metadata.Ecma335/BlobEncoder.xml @@ -244,7 +244,20 @@ to encode an instance method signature, to encode a static method signature. Encodes method signature blob. An encoder of the rest of the signature including return value and parameters. - To be added. + + class remarks. + +## Examples +This example shows how to encode different method signatures: + +:::code language="csharp" source="~/snippets/csharp/System.Reflection.Metadata.Ecma335/BlobEncoder/MethodSignature/MethodSignatureSnippets.cs" id="SnippetEncodeSignatures"::: + + ]]> + is not in range [0, 0xffff].