次の方法で共有


FieldBuilder.SetOffset メソッド

フィールド レイアウトを指定します。

Public Sub SetOffset( _
   ByVal iOffset As Integer _)
[C#]
public void SetOffset(intiOffset);
[C++]
public: void SetOffset(intiOffset);
[JScript]
public function SetOffset(
   iOffset : int);

パラメータ

  • iOffset
    このフィールドを格納している型の中でのフィールドのオフセット。

例外

例外の種類 条件
InvalidOperationException 外側の型が CreateType を使用して作成されています。

解説

SetOffset の使用方法については、次のコード例を参照してください。

 
Imports System
Imports System.Runtime.InteropServices
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.CompilerServices

Public Class FieldBuilder_Sample
   Public Shared Function CreateType(ByVal currentDomain As AppDomain) As Type


      ' Create an assembly.
      Dim myAssemblyName As New AssemblyName()
      myAssemblyName.Name = "DynamicAssembly"
      Dim myAssembly As AssemblyBuilder = currentDomain.DefineDynamicAssembly(myAssemblyName, _
                                          AssemblyBuilderAccess.RunAndSave)
      ' Create a dynamic module in Dynamic Assembly.
      Dim myModuleBuilder As ModuleBuilder = myAssembly.DefineDynamicModule("MyModule", _
                                            "MyModule.mod")
      ' Define a public class named "MyClass" in the assembly.
      Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("MyClass", _
                                         TypeAttributes.Public)
      Dim myTypeBuilder2 As TypeBuilder = myModuleBuilder.DefineType("MyClass2", _
                                          TypeAttributes.Public Or TypeAttributes.BeforeFieldInit Or TypeAttributes.SequentialLayout Or TypeAttributes.AnsiClass Or TypeAttributes.Sealed)
      Dim myFieldBuilder1 As FieldBuilder = myTypeBuilder2.DefineField("myBytes1", _
                                             GetType(Byte), FieldAttributes.Public)
      Dim myFieldBuilder2 As FieldBuilder = myTypeBuilder2.DefineField("myBytes2", _
                                             GetType(Byte), FieldAttributes.Public)
      Dim myFieldBuilder3 As FieldBuilder = myTypeBuilder2.DefineField("myErrorCode", _
                                             GetType(Short), FieldAttributes.Public)
      Dim myFieldBuilder4 As FieldBuilder = myTypeBuilder2.DefineField("myReserved1", _
                                             GetType(Short), FieldAttributes.Public)
      Dim myFieldBuilder5 As FieldBuilder = myTypeBuilder2.DefineField("myReserved2", _
                                             GetType(Short), FieldAttributes.Public)
      Dim myFieldBuilder6 As FieldBuilder = myTypeBuilder2.DefineField("myPathName", _
                                             GetType(Char()), FieldAttributes.Public)
      myFieldBuilder6.SetMarshal(UnmanagedMarshal.DefineByValArray(128))
      myFieldBuilder6.SetOffset(4)
      Dim myType1 As Type = myTypeBuilder2.CreateType()
      ' Create the PInvoke method for 'OpenFile' method of 'Kernel32.dll'.
      Dim myParameters As Type() = {GetType(String), myType1, GetType(System.UInt32)}
      Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefinePInvokeMethod("OpenFile", _
                                                "kernel32.dll", MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.HideBySig, CallingConventions.Standard, GetType(IntPtr), _
                                                myParameters, CallingConvention.Winapi, CharSet.None)
      Dim myAttributeType As Type = GetType(MethodImplAttribute)
      Dim myConstructorInfo As ConstructorInfo = myAttributeType.GetConstructor(New Type(0) _
                                                  {GetType(MethodImplOptions)})
      Dim myAttributeBuilder As New CustomAttributeBuilder(myConstructorInfo, _
                                    New Object(0) {MethodImplOptions.PreserveSig})
      myMethodBuilder.SetCustomAttribute(myAttributeBuilder)
      Dim myParameterBuilder2 As ParameterBuilder = myMethodBuilder.DefineParameter(2, _
                                                   ParameterAttributes.Out, "myClass2")
      Dim myType As Type = myTypeBuilder.CreateType()
      myAssembly.Save("EmittedAssembly.dll")
      Return myType
   End Function 'CreateType

   Public Shared Sub Main()
      Try
         Dim myType As Type = CreateType(Thread.GetDomain())
         Dim myClass2 As Type = myType.Module.GetType("MyClass2")
         Dim myParam2 As Object = Activator.CreateInstance(myClass2)
         Dim myUint As System.UInt32
         myUint.Parse("800")

         Dim myArgs As Object() = {"MyFile.Txt", myParam2, myUint}
         Dim myObject As Object = myType.InvokeMember("OpenFile", _
                                    BindingFlags.Public Or BindingFlags.InvokeMethod Or _
                                    BindingFlags.Static, Nothing, Nothing, myArgs)
         Console.WriteLine("MyClass.OpenFile method returned: " & Microsoft.VisualBasic.Chr(34) & myObject.ToString() & Microsoft.VisualBasic.Chr(34) )
      Catch e As Exception
         Console.WriteLine("Exception Caught " + e.Message)
      End Try
   End Sub 'Main
End Class 'FieldBuilder_Sample

[C#] 
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;

public class FieldBuilder_Sample
{
   public static Type CreateType(AppDomain currentDomain)
   {

      // Create an assembly.
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "DynamicAssembly";
      AssemblyBuilder myAssembly =
         currentDomain.DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.RunAndSave);
      // Create a dynamic module in Dynamic Assembly.
      ModuleBuilder myModuleBuilder=myAssembly.DefineDynamicModule("MyModule","MyModule.mod");
      // Define a public class named "MyClass" in the assembly.
      TypeBuilder myTypeBuilder= myModuleBuilder.DefineType("MyClass",TypeAttributes.Public);
      TypeBuilder myTypeBuilder2 = myModuleBuilder.DefineType("MyClass2",
         TypeAttributes.Public|TypeAttributes.BeforeFieldInit|TypeAttributes.SequentialLayout|TypeAttributes.AnsiClass|TypeAttributes.Sealed);
      FieldBuilder myFieldBuilder1= myTypeBuilder2.DefineField("myBytes1",
                                    typeof(byte),FieldAttributes.Public);
      FieldBuilder myFieldBuilder2= myTypeBuilder2.DefineField("myBytes2",
                                    typeof(byte),FieldAttributes.Public);
      FieldBuilder myFieldBuilder3= myTypeBuilder2.DefineField("myErrorCode",
                                    typeof(short),FieldAttributes.Public);
      FieldBuilder myFieldBuilder4= myTypeBuilder2.DefineField("myReserved1",
                                    typeof(short),FieldAttributes.Public);
      FieldBuilder myFieldBuilder5= myTypeBuilder2.DefineField("myReserved2",
                                    typeof(short),FieldAttributes.Public);
      FieldBuilder myFieldBuilder6= myTypeBuilder2.DefineField("myPathName",
                                    typeof(char[]),FieldAttributes.Public);
      myFieldBuilder6.SetMarshal(UnmanagedMarshal.DefineByValArray(128)); 
      myFieldBuilder6.SetOffset(4);
      Type myType1 = myTypeBuilder2.CreateType();  
      // Create the PInvoke method for 'OpenFile' method of 'Kernel32.dll'.
      Type[] myParameters={ typeof(string), myType1 ,typeof(uint)}; 
      MethodBuilder myMethodBuilder= myTypeBuilder.DefinePInvokeMethod("OpenFile",
                                     "kernel32.dll",MethodAttributes.Public|MethodAttributes.Static|MethodAttributes.HideBySig,
                                       CallingConventions.Standard,typeof(IntPtr),
                                       myParameters,CallingConvention.Winapi,CharSet.None);
      Type myAttributeType = typeof(MethodImplAttribute);
      ConstructorInfo myConstructorInfo = 
         myAttributeType.GetConstructor(new Type[1]{typeof(MethodImplOptions)});
      CustomAttributeBuilder myAttributeBuilder = new CustomAttributeBuilder(myConstructorInfo,
                                                   new object[1]{MethodImplOptions.PreserveSig});
      myMethodBuilder.SetCustomAttribute(myAttributeBuilder);
      ParameterBuilder myParameterBuilder2=myMethodBuilder.DefineParameter(2,
                                            ParameterAttributes.Out,"myClass2");
      Type myType=myTypeBuilder.CreateType();
      myAssembly.Save("EmittedAssembly.dll");
      return myType;


   }
   public static void Main()
   {
      try
      {
         Type myType = CreateType(Thread.GetDomain());
         Type myClass2 = myType.Module.GetType("MyClass2"); 
         object myParam2 = Activator.CreateInstance(myClass2);
         uint myUint=0x00000800;
         object[] myArgs= {"MyFile.Txt",myParam2,myUint};
         Object myObject  = myType.InvokeMember("OpenFile",BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,null,null,myArgs);
         Console.WriteLine("MyClass.OpenFile method returned: \"" + myObject + "\"");
      }
      catch(Exception e)
      {
         Console.WriteLine("Exception Caught "+e.Message);
      }
   }

}

[C++] 
#using <mscorlib.dll>

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::CompilerServices;

Type* CreateType(AppDomain* currentDomain) 
{
   // Create an assembly.
   AssemblyName* myAssemblyName = new AssemblyName();
   myAssemblyName->Name = S"DynamicAssembly";
   AssemblyBuilder* myAssembly =
      currentDomain->DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess::RunAndSave);
   // Create a dynamic module in Dynamic Assembly.
   ModuleBuilder* myModuleBuilder=myAssembly->DefineDynamicModule(S"MyModule", S"MyModule.mod");
   // Define a public class named S"MyClass" in the assembly.
   TypeBuilder* myTypeBuilder= myModuleBuilder->DefineType(S"MyClass", TypeAttributes::Public);
   TypeBuilder* myTypeBuilder2 = myModuleBuilder->DefineType(S"MyClass2",
      static_cast<TypeAttributes>(TypeAttributes::Public|TypeAttributes::BeforeFieldInit|TypeAttributes::SequentialLayout|TypeAttributes::AnsiClass|TypeAttributes::Sealed));
   FieldBuilder* myFieldBuilder1= myTypeBuilder2->DefineField(S"myBytes1",
      __typeof(Byte), FieldAttributes::Public);
   FieldBuilder* myFieldBuilder2= myTypeBuilder2->DefineField(S"myBytes2",
      __typeof(Byte), FieldAttributes::Public);
   FieldBuilder* myFieldBuilder3= myTypeBuilder2->DefineField(S"myErrorCode",
      __typeof(short), FieldAttributes::Public);
   FieldBuilder* myFieldBuilder4= myTypeBuilder2->DefineField(S"myReserved1",
      __typeof(short), FieldAttributes::Public);
   FieldBuilder* myFieldBuilder5= myTypeBuilder2->DefineField(S"myReserved2",
      __typeof(short), FieldAttributes::Public);
   FieldBuilder* myFieldBuilder6= myTypeBuilder2->DefineField(S"myPathName",
      __typeof(char __gc []), FieldAttributes::Public);
   myFieldBuilder6->SetMarshal(UnmanagedMarshal::DefineByValArray(128)); 
   myFieldBuilder6->SetOffset(4);
   Type* myType1 = myTypeBuilder2->CreateType();  
   // Create the PInvoke method for 'OpenFile' method of 'Kernel32.dll'.
   Type* myParameters[]= { __typeof(String), myType1 , __typeof(UInt32)}; 
   MethodBuilder* myMethodBuilder= myTypeBuilder->DefinePInvokeMethod(S"OpenFile",
      S"kernel32.dll", static_cast<MethodAttributes>(MethodAttributes::Public|MethodAttributes::Static|MethodAttributes::HideBySig),
      CallingConventions::Standard, __typeof(IntPtr),
      myParameters, CallingConvention::Winapi, CharSet::None);
   Type* myAttributeType = __typeof(MethodImplAttribute);
   Type* type1[] = {__typeof(MethodImplOptions)};
   ConstructorInfo* myConstructorInfo = myAttributeType->GetConstructor(type1);
   Object* obj1[] = {__box(MethodImplOptions::PreserveSig)};
   CustomAttributeBuilder* myAttributeBuilder = new CustomAttributeBuilder(myConstructorInfo, obj1);
   myMethodBuilder->SetCustomAttribute(myAttributeBuilder);
   ParameterBuilder* myParameterBuilder2=myMethodBuilder->DefineParameter(2,
      ParameterAttributes::Out, S"myClass2");
   Type* myType=myTypeBuilder->CreateType();
   myAssembly->Save(S"EmittedAssembly.dll");
   return myType;
}

int main() {
   try {
      Type* myType = CreateType(Thread::GetDomain());
      Type* myClass2 = myType->Module->GetType(S"MyClass2"); 
      Object* myParam2 = Activator::CreateInstance(myClass2);
      UInt32 myUint=0x00000800;
      Object* myArgs[]= {S"MyFile.Txt", myParam2, __box(myUint)};
      Object* myObject  = myType->InvokeMember(S"OpenFile", static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::InvokeMethod | BindingFlags::Static), 0, 0, myArgs);
      Console::WriteLine(S"MyClass::OpenFile method returned: \"{0}\"", myObject);
   } catch (Exception* e) {
      Console::WriteLine(S"Exception Caught {0}", e->Message);
   }
}

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

FieldBuilder クラス | FieldBuilder メンバ | System.Reflection.Emit 名前空間