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");
}
}
}