动态在另一个项目中运行Enum项目

时间:2013-06-23 14:54:11

标签: c# visual-studio-2012

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

    }
}

1 个答案:

答案 0 :(得分:2)

您可以将生成dll的项目转换为可执行文件,并设置运行它的预构建脚本。这应该有用,虽然你可能有一些问题,VS在你试图替换的.dll上有锁定。

让它生成并替换您编译到Enum .dll中的源文件而不是.dll本身可能会更好。然后,您的解决方案编译将在编译整个解决方案时构建Enum .dll。

以下是使用T4模板执行此操作(生成代码)的链接:Creating Enums from Database Lookup Tables。我希望这有帮助。