我在C#中创建了一个项目,该项目生成一个.dll文件,其中包含从SQL数据库中的查找表生成的动态枚举。 这工作正常,运行项目,生成DLL。
现在我需要将这个dll包含在另一个项目中才能使用这些枚举,但我必须确保每次运行我的项目时,enum 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");
}
}
}
答案 0 :(得分:2)
您可以将生成dll的项目转换为可执行文件,并设置运行它的预构建脚本。这应该有用,虽然你可能有一些问题,VS在你试图替换的.dll上有锁定。
让它生成并替换您编译到Enum .dll中的源文件而不是.dll本身可能会更好。然后,您的解决方案编译将在编译整个解决方案时构建Enum .dll。
以下是使用T4模板执行此操作(生成代码)的链接:Creating Enums from Database Lookup Tables。我希望这有帮助。