Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

1

20.09.2009, 15:26

.Net-Reflection: Assembly aus GAC laden

Wie kann ich ein System.Reflection.Assembly mit ner Assembly aus dem GAC laden(z.B. System.Drawing.dll) bzw. alle Assemblys aus dem GAC auflisten?

Vieln Dank im Voraus!

mfg C--
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

20.09.2009, 16:05

Schau dir mal diese API an: http://msdn.microsoft.com/de-de/library/ms404523.aspx

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

3

20.09.2009, 16:13

Klingt sehr kompliziert, gibt es keine Möglichkeit mit dem System.Reflection.Assembly-Klasse?

Sonst schonmal vielen Dank!
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

20.09.2009, 16:29

Hab sone Möglichkeit auch schonmal gesucht. Kurze Antwort: Einfach gehts nicht. Ich hab am Ende den Ordner einfach nach *.dll Dateien durchsucht :?

Was hast du denn vor?

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

5

20.09.2009, 17:06

Zitat von »"DasGurke"«

Was hast du denn vor?


Ne Kleine IDE in c# für c# ;)
Da will ich so ne Art Objektbrowser machen.
ist auch schon vom prinzip her fast fertig, muss nur nich die entsprechenden dlls laden können ;)
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

20.09.2009, 18:21

Zitat von »"C--"«

Zitat von »"DasGurke"«

Was hast du denn vor?


Ne Kleine IDE in c# für c# ;)
Da will ich so ne Art Objektbrowser machen.
ist auch schon vom prinzip her fast fertig, muss nur nich die entsprechenden dlls laden können ;)


Doch, das geht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
public class GACAssemblyList : IEnumerable, IEnumerable<AssemblyName>
  {
    [DllImport( "fusion" )]
        private static extern void CreateAssemblyEnum(out IAssemblyEnum pEnum, IntPtr pUnkReserved, IAssemblyName pName, ASM_CACHE_FLAGS dwFlags, IntPtr pvReserved);

    private AssemblyName ToAssemblyName( IAssemblyName name )
    {
      uint size = 255;

      if ( name == null )
        throw new ArgumentNullException( "name" );

      AssemblyName result = new AssemblyName();

      // name

      StringBuilder buffer = new StringBuilder( (int)size );
      name.GetName( ref size, buffer );
      result.Name = buffer.ToString();

      // version

      uint verMaj, verMin;
      name.GetVersion( out verMaj, out verMin );
      result.Version = new Version( ( (int)verMaj >> 16 ) & 0xffff, (int)verMaj & 0xffff,
        ( (int)verMin >> 16 ) & 0xffff, (int)verMin & 0xffff );
      
      // culture

      IntPtr property = IntPtr.Zero;
      try
      {
        property = Marshal.AllocHGlobal((int)size);
        name.GetProperty(ASM_NAME.ASM_NAME_CULTURE, property, ref size);
        result.CultureInfo = new CultureInfo( Marshal.PtrToStringAuto( property ) );
      }
      finally
      {
        if ( property != IntPtr.Zero )
          Marshal.FreeHGlobal( property );
      }

      // public key token

      size = 8;
      try
      {
        property = Marshal.AllocHGlobal((int)size);
        name.GetProperty(ASM_NAME.ASM_NAME_PUBLIC_KEY_TOKEN, property, ref size);

        byte[] publicKeyToken = new byte[size];
        for ( int i = 0; i < size; ++i )
          publicKeyToken[i] = Marshal.ReadByte( buffer, i );

        result.SetPublicKeyToken( publicKeyToken );
      }
      finally
      {
        if ( property != IntPtr.Zero )
          Marshal.FreeHGlobal( property );
      }

      return result;
    }

    #region IEnumerable<IAssemblyName> Members

    public IEnumerator<AssemblyName> GetEnumerator()
    {
      IAssemblyName name;
      IAssemblyEnum @enum;

      CreateAssemblyEnum( out @enum, IntPtr.Zero, null, ASM_CACHE_FLAGS.ASM_CACHE_GAC, IntPtr.Zero );
      while (@enum.GetNextAssembly(IntPtr.Zero, out name, 0) == 0)
      {
        yield return ToAssemblyName( name );
      }
    }

    #endregion

    #region IEnumerable Members

    IEnumerator IEnumerable.GetEnumerator()
    {
      return GetEnumerator();
    }

    #endregion
  }

  [Flags]
  internal enum ASM_CACHE_FLAGS
  {
    ASM_CACHE_ZAP       = 0x01,
    ASM_CACHE_GAC       = 0x02,
    ASM_CACHE_DOWNLOAD  = 0x04,
    ASM_CACHE_ROOT      = 0x08
  }

  internal enum ASM_NAME
  {
    ASM_NAME_PUBLIC_KEY = 0,
    ASM_NAME_PUBLIC_KEY_TOKEN,
    ASM_NAME_HASH_VALUE,
    ASM_NAME_NAME,
    ASM_NAME_MAJOR_VERSION,
    ASM_NAME_MINOR_VERSION,
    ASM_NAME_BUILD_NUMBER,
    ASM_NAME_REVISION_NUMBER,
    ASM_NAME_CULTURE,
    ASM_NAME_PROCESSOR_ID_ARRAY,
    ASM_NAME_OSINFO_ARRAY,
    ASM_NAME_HASH_ALGID,
    ASM_NAME_ALIAS,
    ASM_NAME_CODEBASE_URL,
    ASM_NAME_CODEBASE_LASTMOD,
    ASM_NAME_NULL_PUBLIC_KEY,
    ASM_NAME_NULL_PUBLIC_KEY_TOKEN,
    ASM_NAME_CUSTOM,
    ASM_NAME_NULL_CUSTOM, 
    ASM_NAME_MVID,
    ASM_NAME_FILE_MAJOR_VERSION,
    ASM_NAME_FILE_MINOR_VERSION,
    ASM_NAME_FILE_BUILD_NUMBER,
    ASM_NAME_FILE_REVISION_NUMBER,
    ASM_NAME_RETARGET,
    ASM_NAME_SIGNATURE_BLOB,
    ASM_NAME_CONFIG_MASK,
    ASM_NAME_ARCHITECTURE,
    ASM_NAME_MAX_PARAMS
  }

  [Flags]
  internal enum ASM_DISPLAY_FLAGS
  {
    ASM_DISPLAYF_VERSION                 = 0x1,
    ASM_DISPLAYF_CULTURE                 = 0x2,
    ASM_DISPLAYF_PUBLIC_KEY_TOKEN        = 0x4,
    ASM_DISPLAYF_PUBLIC_KEY              = 0x8,
    ASM_DISPLAYF_CUSTOM                  = 0x10,
    ASM_DISPLAYF_PROCESSORARCHITECTURE   = 0x20,
    ASM_DISPLAYF_LANGUAGEID              = 0x40 
  }

  [Flags]
  internal enum ASM_CMP_FLAGS
  {
    ASM_CMPF_NAME               = 0x1,
    ASM_CMPF_MAJOR_VERSION      = 0x2,
    ASM_CMPF_MINOR_VERSION      = 0x4,
    ASM_CMPF_BUILD_NUMBER       = 0x8,
    ASM_CMPF_REVISION_NUMBER    = 0x10,
    ASM_CMPF_PUBLIC_KEY_TOKEN   = 0x20,
    ASM_CMPF_CULTURE            = 0x40,
    ASM_CMPF_CUSTOM             = 0x80,
    ASM_CMPF_ALL,
    ASM_CMPF_DEFAULT            = 0x100 
  }

  [ComImport, Guid("21b8916c-f28e-11d2-a473-00c04f8ef448"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IAssemblyEnum
    {
        [PreserveSig()]
        int GetNextAssembly(
            IntPtr pvReserved,
            out IAssemblyName ppName,
            uint dwFlags);

        [PreserveSig()]
        int Reset();

        [PreserveSig()]
        int Clone(
            out IAssemblyEnum ppEnum);
    }

  [ComImport, Guid("CD193BC0-B4BC-11d2-9833-00C04FC31D2E"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IAssemblyName
    {
    [PreserveSig]
        int SetProperty(
            ASM_NAME PropertyId,
            IntPtr pvProperty,
            uint cbProperty);

        [PreserveSig]
        int GetProperty(
            ASM_NAME PropertyId,
            IntPtr pvProperty,
            ref uint pcbProperty);

        [PreserveSig]
        int Finalize();

    [PreserveSig]
        int GetDisplayName(
            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szDisplayName,
            ref uint pccDisplayName,
            ASM_DISPLAY_FLAGS dwDisplayFlags);

        [PreserveSig]
        int BindToObject(
            ref Guid refIID,
            [MarshalAs(UnmanagedType.IUnknown)] object pUnkSink,
            [MarshalAs(UnmanagedType.IUnknown)] object pUnkContext,
            [MarshalAs(UnmanagedType.LPWStr)] string szCodeBase,
            long llFlags,
            IntPtr pvReserved,
            uint cbReserved,
            out IntPtr ppv);

        [PreserveSig]
        int GetName(
            ref uint lpcwBuffer,
            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwzName);

        [PreserveSig]
        int GetVersion(
            out uint pdwVersionHi,
            out uint pdwVersionLow);

        [PreserveSig]
        int IsEqual(
            IAssemblyName pName,
            ASM_CMP_FLAGS dwCmpFlags);

        [PreserveSig]
        int Clone(
            out IAssemblyName pName);
    }


C-/C++-Quelltext

1
2
3
4
5
6
7
8
// ...

GACAssemblyList list = new GACAssemblyList();

foreach (AssemblyName name in list)
{
   System.Console.WriteLine( name.Name );
}
// ...

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

7

20.09.2009, 18:30

Wow thx, ich probiers gleich mal aus!

:D :D :D :D

PS: was bedeutet @ vor enum?
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

20.09.2009, 18:42

Zitat von »"C--"«


PS: was bedeutet @ vor enum?


Enum ist ein Schlüsselwort. Das @ signalisiert C#, dass hier ein Bezeichner gemeint ist und nicht das Schlüsselwort.

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

9

20.09.2009, 18:46

ok, thx
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

Werbeanzeige