1
1
using System ;
2
+ using System . Collections ;
3
+ using System . Globalization ;
2
4
using System . IO ;
3
5
using System . Reflection ;
4
6
using System . Reflection . Emit ;
@@ -13,11 +15,12 @@ public static void Main()
13
15
{
14
16
SetEntryPoint ( ) ;
15
17
SetResource ( ) ;
18
+ ReadResource ( ) ;
16
19
}
17
20
// <Snippet1>
18
21
public static void SetEntryPoint ( )
19
22
{
20
- PersistedAssemblyBuilder ab = new PersistedAssemblyBuilder ( new AssemblyName ( "MyAssembly" ) , typeof ( object ) . Assembly ) ;
23
+ PersistedAssemblyBuilder ab = new ( new AssemblyName ( "MyAssembly" ) , typeof ( object ) . Assembly ) ;
21
24
TypeBuilder tb = ab . DefineDynamicModule ( "MyModule" ) . DefineType ( "MyType" , TypeAttributes . Public | TypeAttributes . Class ) ;
22
25
// ...
23
26
MethodBuilder entryPoint = tb . DefineMethod ( "Main" , MethodAttributes . HideBySig | MethodAttributes . Public | MethodAttributes . Static ) ;
@@ -27,50 +30,93 @@ public static void SetEntryPoint()
27
30
tb . CreateType ( ) ;
28
31
29
32
MetadataBuilder metadataBuilder = ab . GenerateMetadata ( out BlobBuilder ilStream , out BlobBuilder fieldData ) ;
30
- PEHeaderBuilder peHeaderBuilder = new PEHeaderBuilder ( imageCharacteristics : Characteristics . ExecutableImage ) ;
31
33
32
- ManagedPEBuilder peBuilder = new ManagedPEBuilder (
33
- header : peHeaderBuilder ,
34
+ ManagedPEBuilder peBuilder = new (
35
+ header : PEHeaderBuilder . CreateExecutableHeader ( ) ,
34
36
metadataRootBuilder : new MetadataRootBuilder ( metadataBuilder ) ,
35
37
ilStream : ilStream ,
36
38
mappedFieldData : fieldData ,
37
39
entryPoint : MetadataTokens . MethodDefinitionHandle ( entryPoint . MetadataToken ) ) ;
38
40
39
- BlobBuilder peBlob = new BlobBuilder ( ) ;
41
+ BlobBuilder peBlob = new ( ) ;
40
42
peBuilder . Serialize ( peBlob ) ;
41
43
42
- // in case saving to a file :
43
- using var fileStream = new FileStream ( "MyAssembly.exe" , FileMode . Create , FileAccess . Write ) ;
44
+ // Create the executable :
45
+ using FileStream fileStream = new ( "MyAssembly.exe" , FileMode . Create , FileAccess . Write ) ;
44
46
peBlob . WriteContentTo ( fileStream ) ;
45
47
}
46
48
// </Snippet1>
47
49
// <Snippet2>
48
50
public static void SetResource ( )
49
51
{
50
- PersistedAssemblyBuilder ab = new PersistedAssemblyBuilder ( new AssemblyName ( "MyAssembly" ) , typeof ( object ) . Assembly ) ;
52
+ PersistedAssemblyBuilder ab = new ( new AssemblyName ( "MyAssembly" ) , typeof ( object ) . Assembly ) ;
51
53
ab . DefineDynamicModule ( "MyModule" ) ;
52
54
MetadataBuilder metadata = ab . GenerateMetadata ( out BlobBuilder ilStream , out _ ) ;
53
55
54
- using MemoryStream stream = new MemoryStream ( ) ;
55
- ResourceWriter myResourceWriter = new ResourceWriter ( stream ) ;
56
+ using MemoryStream stream = new ( ) ;
57
+ ResourceWriter myResourceWriter = new ( stream ) ;
56
58
myResourceWriter . AddResource ( "AddResource 1" , "First added resource" ) ;
57
59
myResourceWriter . AddResource ( "AddResource 2" , "Second added resource" ) ;
58
60
myResourceWriter . AddResource ( "AddResource 3" , "Third added resource" ) ;
59
61
myResourceWriter . Close ( ) ;
60
- BlobBuilder resourceBlob = new BlobBuilder ( ) ;
61
- resourceBlob . WriteBytes ( stream . ToArray ( ) ) ;
62
- metadata . AddManifestResource ( ManifestResourceAttributes . Public , metadata . GetOrAddString ( "MyResource" ) , default , ( uint ) resourceBlob . Count ) ;
63
62
64
- ManagedPEBuilder peBuilder = new ManagedPEBuilder (
65
- header : new PEHeaderBuilder ( imageCharacteristics : Characteristics . ExecutableImage | Characteristics . Dll ) ,
63
+ byte [ ] data = stream . ToArray ( ) ;
64
+ BlobBuilder resourceBlob = new ( ) ;
65
+ resourceBlob . WriteInt32 ( data . Length ) ;
66
+ resourceBlob . WriteBytes ( data ) ;
67
+
68
+ metadata . AddManifestResource (
69
+ ManifestResourceAttributes . Public ,
70
+ metadata . GetOrAddString ( "MyResource.resources" ) ,
71
+ implementation : default ,
72
+ offset : 0 ) ;
73
+
74
+ ManagedPEBuilder peBuilder = new (
75
+ header : PEHeaderBuilder . CreateLibraryHeader ( ) ,
66
76
metadataRootBuilder : new MetadataRootBuilder ( metadata ) ,
67
77
ilStream : ilStream ,
68
78
managedResources : resourceBlob ) ;
69
79
70
- BlobBuilder blob = new BlobBuilder ( ) ;
80
+ BlobBuilder blob = new ( ) ;
71
81
peBuilder . Serialize ( blob ) ;
72
- using var fileStream = new FileStream ( "MyAssemblyWithResource.dll" , FileMode . Create , FileAccess . Write ) ;
82
+
83
+ // Create the assembly:
84
+ using FileStream fileStream = new ( "MyAssemblyWithResource.dll" , FileMode . Create , FileAccess . Write ) ;
73
85
blob . WriteContentTo ( fileStream ) ;
74
86
}
75
87
// </Snippet2>
88
+ // <Snippet3>
89
+ public static void ReadResource ( )
90
+ {
91
+ Assembly readAssembly = Assembly . LoadFile ( Path . Combine (
92
+ Path . GetDirectoryName ( Assembly . GetExecutingAssembly ( ) . Location ) ,
93
+ "MyAssemblyWithResource.dll" ) ) ;
94
+
95
+ // Use ResourceManager.GetString() to read the resources.
96
+ ResourceManager rm = new ( "MyResource" , readAssembly ) ;
97
+ Console . WriteLine ( "Using ResourceManager.GetString():" ) ;
98
+ Console . WriteLine ( $ "{ rm . GetString ( "AddResource 1" , CultureInfo . InvariantCulture ) } ") ;
99
+ Console . WriteLine ( $ "{ rm . GetString ( "AddResource 2" , CultureInfo . InvariantCulture ) } ") ;
100
+ Console . WriteLine ( $ "{ rm . GetString ( "AddResource 3" , CultureInfo . InvariantCulture ) } ") ;
101
+
102
+ // Use ResourceSet to enumerate the resources.
103
+ Console . WriteLine ( ) ;
104
+ Console . WriteLine ( "Using ResourceSet:" ) ;
105
+ ResourceSet resourceSet = rm . GetResourceSet ( CultureInfo . InvariantCulture , createIfNotExists : true , tryParents : false ) ;
106
+ foreach ( DictionaryEntry entry in resourceSet )
107
+ {
108
+ Console . WriteLine ( $ "Key: { entry . Key } , Value: { entry . Value } ") ;
109
+ }
110
+
111
+ // Use ResourceReader to enumerate the resources.
112
+ Console . WriteLine ( ) ;
113
+ Console . WriteLine ( "Using ResourceReader:" ) ;
114
+ using Stream stream = readAssembly . GetManifestResourceStream ( "MyResource.resources" ) ! ;
115
+ using ResourceReader reader = new ( stream ) ;
116
+ foreach ( DictionaryEntry entry in reader )
117
+ {
118
+ Console . WriteLine ( $ "Key: { entry . Key } , Value: { entry . Value } ") ;
119
+ }
120
+ }
121
+ // </Snippet3>
76
122
}
0 commit comments