ModuleBuilder.DefineManifestResource メソッド
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub DefineManifestResource ( _ name As String, _ stream As Stream, _ attribute As ResourceAttributes _ )
Dim instance As ModuleBuilder Dim name As String Dim stream As Stream Dim attribute As ResourceAttributes instance.DefineManifestResource(name, stream, attribute)
public function DefineManifestResource ( name : String, stream : Stream, attribute : ResourceAttributes )


アセンブリ マニフェストに記録されたリソースは、マネージ リソースまたはマニフェスト リソース BLOB であり、どちらの場合もリンクまたは埋め込みによってアセンブリに含めることができます。動的アセンブリでは、4 つのシナリオすべてがサポートされています。
-
マネージ リソースを動的アセンブリのマニフェスト モジュール、またはサテライト モジュールに埋め込むには、ModuleBuilder.DefineResource メソッドを使用してリソース ライタを取得し、ResourceWriter.AddResource メソッドを使用してリソースを追加します。
-
マネージ リソースを動的アセンブリにリンクするには、AssemblyBuilder.DefineResource メソッドを使用してリソース ライタを取得し、ResourceWriter.AddResource メソッドを使用してリンク済みのリソースを追加します。
-
マニフェスト リソース BLOB を動的アセンブリにリンクするには、AssemblyBuilder.AddResourceFile メソッドを使用してリンク済みのリソースを追加します。
また、単一の Win32 リソースを、AssemblyBuilder.DefineUnmanagedResource メソッドまたは ModuleBuilder.DefineUnmanagedResource メソッドを使用してアセンブリに結びつけることもできます。このリソースは、アセンブリ マニフェストに表示されません。

アンマネージ埋め込みリソースを格納する EmittedManifestResourceAssembly.exe という名前の動的アセンブリを生成および保存するコード例を次に示します。このコード例では、1 つのモジュールで構成されているアセンブリを作成し、アンマネージ リソースを格納するメモリ ストリームを開きます。さらに、コードで DefineManifestResource メソッドを呼び出してリソースを定義します。
![]() |
---|
リソースに対してはどのような種類のストリームでも使用できます。たとえば、ファイルからアンマネージ バイナリ データを読み込むこともできます。 |
コード例では、Main メソッドを使用して動的モジュールで型を定義し、メソッド本体の MSIL を生成します。Main メソッドの本体が生成され、型が作成されると、コード例では、マニフェスト リソースに関連付けられているストリームに 5 バイトを書き込みます。アセンブリの保存時に、アセンブリにリソースが追加されます。
コード例の実行後は、出力されたアセンブリを実行できます。出力されたアセンブリの Main メソッドのコードは、埋め込まれたマニフェスト リソースを読み込み、バイト値をコンソールに出力します。MSIL 逆アセンブラ (Ildasm.exe) を使用すると、アセンブリ マニフェストの情報を表示できます。
Imports System Imports System.Reflection Imports System.Reflection.Emit Imports System.IO Public Class Example Public Shared Sub Main() ' Define a dynamic assembly with one module. The module ' name and the assembly name are the same. Dim asmName As New AssemblyName("EmittedManifestResourceAssembly") Dim asmBuilder As AssemblyBuilder = _ AppDomain.CurrentDomain.DefineDynamicAssembly( _ asmName, _ AssemblyBuilderAccess.RunAndSave _ ) Dim modBuilder As ModuleBuilder = _ asmBuilder.DefineDynamicModule( _ asmName.Name, _ asmName.Name + ".exe" _ ) ' Create a memory stream for the unmanaged resource data. ' You can use any stream; for example, you might read the ' unmanaged resource data from a binary file. It is not ' necessary to put any data into the stream right now. Dim ms As New MemoryStream(1024) ' Define a public manifest resource with the name ' "MyBinaryData, and associate it with the memory stream. modBuilder.DefineManifestResource( _ "MyBinaryData", _ ms, _ ResourceAttributes.Public _ ) ' Create a type with a public static Main method that will ' be the entry point for the emitted assembly. ' ' The purpose of the Main method in this example is to read ' the manifest resource and display it, byte by byte. ' Dim tb As TypeBuilder = modBuilder.DefineType("Example") Dim main As MethodBuilder = tb.DefineMethod( _ "Main", _ MethodAttributes.Public Or MethodAttributes.Static _ ) ' The Main method uses the Assembly type and the Stream ' type. Dim asm As Type = GetType([Assembly]) Dim str As Type = GetType(Stream) ' Get MethodInfo objects for the methods called by ' Main. Dim getEx As MethodInfo = asm.GetMethod("GetExecutingAssembly") ' Use the overload of GetManifestResourceStream that ' takes one argument, a string. Dim getMRS As MethodInfo = asm.GetMethod( _ "GetManifestResourceStream", _ New Type() {GetType(String)} _ ) Dim rByte As MethodInfo = str.GetMethod("ReadByte") ' Use the overload of WriteLine that writes an Int32. Dim write As MethodInfo = GetType(Console).GetMethod( _ "WriteLine", _ New Type() {GetType(Integer)} _ ) Dim ilg As ILGenerator = main.GetILGenerator() ' Main uses two local variables: the instance of the ' stream returned by GetManifestResourceStream, and ' the value returned by ReadByte. The load and store ' instructions refer to these locals by position ' (0 and 1). Dim s As LocalBuilder = ilg.DeclareLocal(str) Dim b As LocalBuilder = ilg.DeclareLocal(GetType(Integer)) ' Call the static Assembly.GetExecutingAssembly() method, ' which leaves the assembly instance on the stack. Push the ' string name of the resource on the stack, and call the ' GetManifestResourceStream(string) method of the assembly ' instance. ilg.EmitCall(OpCodes.Call, getEx, Nothing) ilg.Emit(OpCodes.Ldstr, "MyBinaryData") ilg.EmitCall(OpCodes.Callvirt, getMRS, Nothing) ' Store the Stream instance (actually an instance ' of UnmanagedMemoryStream, which derives from ' Stream). ilg.Emit(OpCodes.Stloc_0) ' Create a label, and associate it with this point ' in the emitted code. Dim theLoop As Label = ilg.DefineLabel() ilg.MarkLabel(theLoop) ' Load the Stream instance onto the stack, and call ' its ReadByte method. The return value is on the ' stack now; store it in location 1 (variable b). ilg.Emit(OpCodes.Ldloc_0) ilg.EmitCall(OpCodes.Callvirt, rByte, Nothing) ilg.Emit(OpCodes.Stloc_1) ' Load the value on the stack again, and call the ' WriteLine method to print it. ilg.Emit(OpCodes.Ldloc_1) ilg.EmitCall(OpCodes.Call, write, Nothing) ' Load the value one more time; load -1 (minus one) ' and compare the two values. If return value from ' ReadByte was not -1, branch to the label 'loop'. ilg.Emit(OpCodes.Ldloc_1) ilg.Emit(OpCodes.Ldc_I4_M1) ilg.Emit(OpCodes.Ceq) ilg.Emit(OpCodes.Brfalse_S, theLoop) ' When all the bytes in the stream have been read, ' return. This is the end of Main. ilg.Emit(OpCodes.Ret) ' Create the type "Example" in the dynamic assembly. tb.CreateType() ' Because the manifest resource was added as an open ' stream, the data can be written at any time, right up ' until the assembly is saved. In this case, the data ' consists of five bytes. ms.Write(New Byte() {105, 36, 74, 97, 109}, 0, 5) ms.SetLength(5) ' Set the Main method as the entry point for the ' assembly, and save the assembly. The manifest resource ' is read from the memory stream, and appended to the ' end of the assembly. You can open the assembly with ' Ildasm and view the resource header for "MyBinaryData". asmBuilder.SetEntryPoint(main) asmBuilder.Save(asmName.Name + ".exe") Console.WriteLine("Now run EmittedManifestResourceAssembly.exe") End Sub End Class ' This code example doesn't produce any output. The assembly it ' emits, EmittedManifestResourceAssembly.exe, produces the following ' output: ' '105 '36 '74 '97 '109 '-1 '
using System; using System.Reflection; using System.Reflection.Emit; using System.IO; public class Example { public static void Main() { // Define a dynamic assembly with one module. The module // name and the assembly name are the same. AssemblyName asmName = new AssemblyName("EmittedManifestResourceAssembly"); AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( asmName, AssemblyBuilderAccess.RunAndSave ); ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule( asmName.Name, asmName.Name + ".exe" ); // Create a memory stream for the unmanaged resource data. // You can use any stream; for example, you might read the // unmanaged resource data from a binary file. It is not // necessary to put any data into the stream right now. MemoryStream ms = new MemoryStream(1024); // Define a public manifest resource with the name // "MyBinaryData, and associate it with the memory stream. modBuilder.DefineManifestResource( "MyBinaryData", ms, ResourceAttributes.Public ); // Create a type with a public static Main method that will // be the entry point for the emitted assembly. // // The purpose of the Main method in this example is to read // the manifest resource and display it, byte by byte. // TypeBuilder tb = modBuilder.DefineType("Example"); MethodBuilder main = tb.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static ); // The Main method uses the Assembly type and the Stream // type. Type asm = typeof(Assembly); Type str = typeof(Stream); // Get MethodInfo objects for the methods called by // Main. MethodInfo getEx = asm.GetMethod("GetExecutingAssembly"); // Use the overload of GetManifestResourceStream that // takes one argument, a string. MethodInfo getMRS = asm.GetMethod( "GetManifestResourceStream", new Type[] {typeof(string)} ); MethodInfo rByte = str.GetMethod("ReadByte"); // Use the overload of WriteLine that writes an Int32. MethodInfo write = typeof(Console).GetMethod( "WriteLine", new Type[] {typeof(int)} ); ILGenerator ilg = main.GetILGenerator(); // Main uses two local variables: the instance of the // stream returned by GetManifestResourceStream, and // the value returned by ReadByte. The load and store // instructions refer to these locals by position // (0 and 1). LocalBuilder s = ilg.DeclareLocal(str); LocalBuilder b = ilg.DeclareLocal(typeof(int)); // Call the static Assembly.GetExecutingAssembly() method, // which leaves the assembly instance on the stack. Push the // string name of the resource on the stack, and call the // GetManifestResourceStream(string) method of the assembly // instance. ilg.EmitCall(OpCodes.Call, getEx, null); ilg.Emit(OpCodes.Ldstr, "MyBinaryData"); ilg.EmitCall(OpCodes.Callvirt, getMRS, null); // Store the Stream instance (actually an instance // of UnmanagedMemoryStream, which derives from // Stream). ilg.Emit(OpCodes.Stloc_0); // Create a label, and associate it with this point // in the emitted code. Label loop = ilg.DefineLabel(); ilg.MarkLabel(loop); // Load the Stream instance onto the stack, and call // its ReadByte method. The return value is on the // stack now; store it in location 1 (variable b). ilg.Emit(OpCodes.Ldloc_0); ilg.EmitCall(OpCodes.Callvirt, rByte, null); ilg.Emit(OpCodes.Stloc_1); // Load the value on the stack again, and call the // WriteLine method to print it. ilg.Emit(OpCodes.Ldloc_1); ilg.EmitCall(OpCodes.Call, write, null); // Load the value one more time; load -1 (minus one) // and compare the two values. If return value from // ReadByte was not -1, branch to the label 'loop'. ilg.Emit(OpCodes.Ldloc_1); ilg.Emit(OpCodes.Ldc_I4_M1); ilg.Emit(OpCodes.Ceq); ilg.Emit(OpCodes.Brfalse_S, loop); // When all the bytes in the stream have been read, // return. This is the end of Main. ilg.Emit(OpCodes.Ret); // Create the type "Example" in the dynamic assembly. tb.CreateType(); // Because the manifest resource was added as an open // stream, the data can be written at any time, right up // until the assembly is saved. In this case, the data // consists of five bytes. ms.Write(new byte[] { 105, 36, 74, 97, 109 }, 0, 5); ms.SetLength(5); // Set the Main method as the entry point for the // assembly, and save the assembly. The manifest resource // is read from the memory stream, and appended to the // end of the assembly. You can open the assembly with // Ildasm and view the resource header for "MyBinaryData". asmBuilder.SetEntryPoint(main); asmBuilder.Save(asmName.Name + ".exe"); Console.WriteLine("Now run EmittedManifestResourceAssembly.exe"); } } /* This code example doesn't produce any output. The assembly it emits, EmittedManifestResourceAssembly.exe, produces the following output: 105 36 74 97 109 -1 */

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からModuleBuilder.DefineManifestResource メソッドを検索する場合は、下記のリンクをクリックしてください。

- ModuleBuilder.DefineManifestResource メソッドのページへのリンク