-1

すべてのコマンド ID のコレクションが必要なアプリケーションを作成しています。これらは、複数の dll に存在します。bin フォルダーにアクセスできます。

私はリフレクションを使用し、一度に1つのdllに対してこれを行うことができました

Assembly a = System.Reflection.Assembly.LoadFrom(@"T:\Bin\Commands.dll");

IEnumerable<Type> types = Helper.GetLoadableTypes(a);
foreach (Type type in types)
{
    FieldInfo ID = type.GetField("ID");

    if (ID != null)
    {
        string fromValue = (ID.GetRawConstantValue().ToString());

        ListFromCSFiles.Add(fromValue);
    }
}

私の問題は、すべての dll からすべての ID を取得する必要があることです。Bin フォルダーには、dll 以外のファイルも含まれています。

4

2 に答える 2

2

ディレクトリ内のdllをループするだけでよいようです。

また、既に読み込まれているアセンブリを読み込まないようにする必要があります。

例えば:

  string bin = "c:\YourBin";

    DirectoryInfo oDirectoryInfo = new DirectoryInfo( bin );

    //Check the directory exists
    if ( oDirectoryInfo.Exists )
    {
       //Foreach Assembly with dll as the extension
       foreach ( FileInfo oFileInfo in oDirectoryInfo.GetFiles( "*.dll", SearchOption.AllDirectories ) )
       {

                        Assembly tempAssembly = null;

                        //Before loading the assembly, check all current loaded assemblies in case talready loaded
                        //has already been loaded as a reference to another assembly
                        //Loading the assembly twice can cause major issues
                        foreach ( Assembly loadedAssembly in AppDomain.CurrentDomain.GetAssemblies() )
                        {
                            //Check the assembly is not dynamically generated as we are not interested in these
                            if ( loadedAssembly.ManifestModule.GetType().Namespace != "System.Reflection.Emit" )
                            {
                                //Get the loaded assembly filename
                                string sLoadedFilename =
                                    loadedAssembly.CodeBase.Substring( loadedAssembly.CodeBase.LastIndexOf( '/' ) + 1 );

                                //If the filenames match, set the assembly to the one that is already loaded
                                if ( sLoadedFilename.ToUpper() == oFileInfo.Name.ToUpper() )
                                {
                                    tempAssembly = loadedAssembly;
                                    break;
                                }
                            }
                        }

                        //If the assembly is not aleady loaded, load it manually
                        if ( tempAssembly == null )
                        {
                            tempAssembly = Assembly.LoadFile( oFileInfo.FullName );
                        }

                        Assembly a = tempAssembly;
       }

     }
于 2013-01-09T09:51:10.790 に答える
0

を使用して、ディレクトリのすべてのファイルを取得してみてくださいDirectory.GetFiles。その後、http://msdn.microsoft.com/en-us/library/ms173100.aspxに従って、アセンブリを決定し、各アセンブリに独自の方法を使用します。

于 2013-01-09T09:54:29.663 に答える