ModuleDefinition.Read and ModuleDefinition.Import handle generic type
arguments for an open generic type differently. ModuleDefinition.Read does
it correctly while ModuleDenifition.Import does not import the generic
parameter name correctly:
Here's an quick and dirty repro:
public class StringKeyedDictionary<TValue>
{
public static readonly Dictionary<string, TValue> FIELD = null;
}
public void Test()
{
string code = @"
using System;
using System.Collections.Generic;
public class StringKeyedDictionary<TValue>
{
public static readonly Dictionary<string, TValue> FIELD;
}";
using (var x = new TemporaryDirectoryFixture())
{
string subject = Path.Combine( x.DirectoryPath,
"library.dll" );
//CSharpCompiler.Compile( code, subject,
CSharpCompiler.Clr.Two, CSharpCompiler.Target.Library );
var asm = AssemblyDefinition.ReadAssembly( subject );
var ty = asm.MainModule.Types.Skip( 1 ).First();
var read = (GenericInstanceType)ty.Fields.First().FieldType;
ModuleDefinition dummy = ModuleDefinition.CreateModule(
"asd", ModuleKind.NetModule );
var import = (GenericInstanceType)dummy.Import( typeof(
StringKeyedDictionary<> ).GetField( "FIELD" ).FieldType );
Assert.Equal( read.GenericArguments, import.GenericArguments
);
}
The difference is:
import.GenericArguments.ToList()
Count = 2
[0]: {System.String}
[1]: {TKey}
read.GenericArguments.ToList()
Count = 2
[0]: {System.String}
[1]: {TValue}
I am positive this has just something to do with the Importer. What are your
thoughts?
--
--
mono-cecil