Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
using System;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection;

namespace MethodSignatureSnippets
{
static class MethodSignatureSnippets
{
// <SnippetEncodeSignatures>
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>(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;
}
// </SnippetEncodeSignatures>

public static void Run()
{
var metadataBuilder = new MetadataBuilder();
EncodeMethodSignatureParameterless();
EncodeMethodSignaturePrimitiveTypes();
EncodeMethodSignatureClassType(metadataBuilder);
EncodeMethodSignatureModifiedTypes();
EncodeMethodSignatureGeneric();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace MethodSignatureSnippets
{
class Program
{
static void Main(string[] args)
{
MethodSignatureSnippets.Run();
}
}
}
15 changes: 14 additions & 1 deletion xml/System.Reflection.Metadata.Ecma335/BlobEncoder.xml
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,20 @@
<see langword="true" /> to encode an instance method signature, <see langword="false" /> to encode a static method signature.</param>
<summary>Encodes method signature blob.</summary>
<returns>An encoder of the rest of the signature including return value and parameters.</returns>
<remarks>To be added.</remarks>
<remarks>
<format type="text/markdown"><![CDATA[

## Remarks

Method signature blobs are used when defining or referencing methods in .NET metadata. For a complete example of emitting a method definition, see the <xref:System.Reflection.Metadata.Ecma335.MetadataBuilder> 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":::

]]></format>
</remarks>
<exception cref="T:System.ArgumentOutOfRangeException">
<paramref name="genericParameterCount" /> is not in range [0, 0xffff].</exception>
</Docs>
Expand Down