Hello Marek,
I'd suggest you use the utility "ILReader" from:
http://blogs.msdn.com/yirutang/archive/2006/06/07/621125.aspx
plus the .net Reflector from
http://www.aisto.com/roeder/dotnet/
The two tools can help us write codes to dynamically create
assembly/module/type. With the help of the tools, I wrote the following
code for your SimpleType2 type:
(Note: because Newsgroup system may wrap the long sentences and make it
hard for you to read my codes, I attach the .cs file to this message for
your convenience. You can download the .cs code file with outlook express
or windows mail)
public class Test
{
static TypeBuilder fixedBufTypeBuilder;
public static void Main()
{
AppDomain.CurrentDomain.TypeResolve += new
ResolveEventHandler(CurrentDomain_TypeResolve);
#region AttributeBuilders
// UnsafeValueTypeAttribute
ConstructorInfo unsafeValueTypeCtor =
typeof(UnsafeValueTypeAttribute).GetConstructor(new Type[] { });
CustomAttributeBuilder unsafeAttrBuilder = new
CustomAttributeBuilder(unsafeValueTypeCtor, new object[] { });
// UnverifiableCodeAttribute
ConstructorInfo unverifiableCtor =
typeof(UnverifiableCodeAttribute).GetConstructor(new Type[] { });
CustomAttributeBuilder unverifiableAttrBuilder = new
CustomAttributeBuilder(unverifiableCtor, new object[] { });
// CompilerGeneratedAttribute
ConstructorInfo compilerGenCtor =
typeof(CompilerGeneratedAttribute).GetConstructor(new Type[] { });
CustomAttributeBuilder compilerGenAttrBuilder = new
CustomAttributeBuilder(compilerGenCtor, new object[] { });
// FixedBufferAttribute
ConstructorInfo fixedBufCtor =
typeof(FixedBufferAttribute).GetConstructor(new Type[] { typeof(Type),
typeof(int) });
CustomAttributeBuilder fixedBufAttrBuilder = new
CustomAttributeBuilder(fixedBufCtor, new object[] { typeof(double), 5 });
#endregion
AssemblyName asmname = new AssemblyName("mytest");
AssemblyBuilder asmbuild =
AppDomain.CurrentDomain.DefineDynamicAssembly(asmname,
AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder =
asmbuild.DefineDynamicModule("mytest", "mytest.dll");
moduleBuilder.SetCustomAttribute(unverifiableAttrBuilder);
TypeBuilder typeBuilder = moduleBuilder.DefineType("SimpleType2",
TypeAttributes.Public | TypeAttributes.SequentialLayout,
typeof(ValueType), PackingSize.Size8);
#region <dArray>e__FixedBuffer0
fixedBufTypeBuilder =
typeBuilder.DefineNestedType("<dArray>e__FixedBuffer0",
TypeAttributes.NestedPublic | TypeAttributes.SequentialLayout,
typeof(ValueType), 40);
fixedBufTypeBuilder.SetCustomAttribute(compilerGenAttrBuilder);
fixedBufTypeBuilder.SetCustomAttribute(unsafeAttrBuilder);
fixedBufTypeBuilder.DefineField("FixedElementField",
typeof(double), FieldAttributes.Public);
#endregion
typeBuilder.DefineField("dScalar1", typeof(double),
FieldAttributes.Public);
FieldBuilder fixedBufFieldBuilder =
typeBuilder.DefineField("dArray", fixedBufTypeBuilder,
FieldAttributes.Public);
fixedBufFieldBuilder.SetCustomAttribute(fixedBufAttrBuilder);
typeBuilder.DefineField("iScalar1", typeof(int),
FieldAttributes.Public);
typeBuilder.CreateType();
asmbuild.Save("mytest");
}
private static Assembly CurrentDomain_TypeResolve(object sender,
ResolveEventArgs args)
{
if (args.Name == "<dArray>e__FixedBuffer0")
{
return fixedBufTypeBuilder.CreateType().Assembly;
}
return null;
}
}
In the code above, the line
AppDomain.CurrentDomain.TypeResolve += new
ResolveEventHandler(CurrentDomain_TypeResolve);
Is used for the nested struct type. See:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?Feedba
ckID=98299
Below is my detailed steps when I write the code above (I think this may
help you if you encounter such cases again in future)
Step1. Compose a simple assembly with our target code:
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public unsafe struct SimpleType2
{
public double dScalar1;
public fixed double dArray[5];
public int iScalar1;
}
Step2. Compile the assembly, use .NET Reflector to open the output dll, and
use ILReader to parse the dll.
Step3. Translate the output of ILReader to our AssemblyBuilder,
TypeBuilder, DefineField codes
Step4. Run our AssemblyBuilder, TypeBuilder, DefineField codes and get the
resulting assembly dll.
Step5. Use .Net Reflector to open the dll, and compare its result with the
that of the dll in step2.
If you have any other concerns or questions, feel free to let me know.
Regards,
Jialiang Ge (
[email protected], remove 'online.')
Microsoft Online Community Support
Delighting our customers is our #1 priority. We welcome your comments and
suggestions about how we can improve the support we provide to you. Please
feel free to let my manager know what you think of the level of service
provided. You can send feedback directly to my manager at:
(e-mail address removed).
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.
Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights