3

SQL データベースのルックアップ テーブルから生成された動的列挙型を含む .dll ファイルを生成するプロジェクトを C# で作成しました。これは問題なく動作し、プロジェクトを実行すると、dll が生成されます。

これらの列挙型を使用できるようにするには、この dll を別のプロジェクトに含める必要がありますが、プロジェクトを実行するたびに列挙型 dll が最新であることを確認する必要があります。


enum dllを含むメイン プロジェクトを実行する前に、enum dll プロジェクトを実行するにはどうすればよいですか? そのための解決策はありますか?

using System;
using System.Data.SqlClient;
using System.Reflection;
using System.Reflection.Emit;

namespace DynamicEnums
{
    class EnumCreator
    {
        static void Main(string[] args)
        {
            const string connectionString = 
                "Integrated Security=SSPI;Persist " +
                "Security Info=False;Initial Catalog=MyDB;Data Source=MyServer;" +
                "MultipleActiveResultSets=True";

            // Define Namespace name
            const string nameSpace = "EnumTypes";

            // Define Assembly name
            const string strAssemblyName = "MyEnums";

            // Table Suffix 
            const string tableSuffix = "TypeEnum";

            var mainQuery = string.Format("Select SCHEMA_NAME(schema_id) as [Schema], Name" +
                " from sys.tables where name like '%{0}'", tableSuffix); 

            // Get the current application domain for the current thread
            var currentDomain = AppDomain.CurrentDomain;

            // Create a dynamic assembly in the current application domain,
            // and allow it to be executed and saved to disk.
            var name = new AssemblyName(strAssemblyName);

            var assemblyBuilder =
                    currentDomain.DefineDynamicAssembly(name,
                            AssemblyBuilderAccess.RunAndSave);

            var moduleBuilder = 
                assemblyBuilder.DefineDynamicModule(name.Name, name.Name + ".dll");

            #region GetTheDataFromTheDatabase

            //Search for all Enum Lookup Tables
            using (var dbConn = new SqlConnection(connectionString))
            {
                using (var cmd = new SqlCommand())
                {
                    dbConn.Open();

                    cmd.Connection = dbConn;
                    cmd.CommandText = mainQuery;

                    SqlDataReader readerTables = cmd.ExecuteReader();

                    while (readerTables.Read())
                    {
                        using (var cmdEnum = new SqlCommand())
                        {
                            cmdEnum.Connection = dbConn;
                            cmdEnum.CommandText = string.Format("Select [{0}Id], [Name] from {1}.{0}",
                                readerTables["Name"],
                                readerTables["Schema"]);

                            SqlDataReader readerEnums = cmdEnum.ExecuteReader();

                            // Define a public enumeration and an underlying type of Integer
                            var myEnum = moduleBuilder.DefineEnum(
                                    string.Format("{0}.{1}", nameSpace, readerTables["Name"]),
                                    TypeAttributes.Public,
                                    typeof(int)
                            );

                            while (readerEnums.Read())
                            {
                                myEnum.DefineLiteral(readerEnums[1].ToString(),
                                       Convert.ToInt32(readerEnums[0].ToString()));       
                            }

                            // Create the enum
                            myEnum.CreateType();

                            readerEnums.Close();
                        }                        
                    }              
                    readerTables.Close();
                }

            } //eof using

            #endregion GetTheDataFromTheDatabase

            // save assembly
            assemblyBuilder.Save(name.Name + ".dll");
        }

    }
}
4

1 に答える 1