簡體   English   中英

如何通過反射引用另一個項目中的EF配置?

[英]How do I reference an EF Configuration in another project via reflection?

我正在嘗試創建一個控制台應用程序以生成用於自動化目的的SQL遷移腳本-由以下命令生成的相同腳本:

更新數據庫腳本

從軟件包管理器控制台。

如果我直接引用包含DBMigrationsConfiguration的DLL,則可以在我創建的控制台應用程序中生成腳本。

例如,這有效:

using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.IO;
using TAPS.Infrastructure.Migrations;

namespace msg
{
    class Program
    {
        static void Main(string[] args)
        {

            var migrator = new DbMigrator(new Configuration());
            var scriptor = new MigratorScriptingDecorator(migrator);
            var sql = scriptor.ScriptUpdate(null, null);            
            File.WriteAllText(@"c:\script.sql", sql);
        }
    }
}

請注意,我直接引用了DLL,一條using語句,並且使用了一條新語句來實例化Config對象。

現在,如果我嘗試通過反射進行操作,那么我將從行中返回null:

DbMigrationsConfiguration configuration = (DbMigrationsConfiguration)assembly.CreateInstance("TAPS.Infrastructure.Migrations, Configuration");            

完整的代碼示例如下,我正在嘗試通過反射進行工作:

using System;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.IO;
using System.Reflection;

namespace msg
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes(@"C:\DLLPath\TAPS.Infrastructure.dll"));
            DbMigrationsConfiguration configuration = (DbMigrationsConfiguration)assembly.CreateInstance("TAPS.Infrastructure.Migrations, Configuration");            
            var migrator = new DbMigrator(configuration);
            var scriptor = new MigratorScriptingDecorator(migrator);
            var sql = scriptor.ScriptUpdate(null, null);            
            File.WriteAllText(@"c:\script.sql", sql);
        }
    }
}

配置變量返回為空。

如果Configuration類型位於TAPS.Infrastructure.Migrations命名空間中,則需要通過反射來獲取它,那么您使用的語法是錯誤的。

var foo = assembly.CreateInstance("TAPS.Infrastructure.Migrations.Configuration");   

嘗試使用此方法遍歷加載的程序集中的所有類型,名稱必須匹配。

foreach (var type in assembly.GetTypes())
{
    Console.WriteLine(type);
}

這段代碼修復了它:

class ProxyDomain : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFrom(assemblyPath);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(ex.Message);
        }
    }
}

來自@shytikov的答復:

如何以所有引用遞歸地將程序集加載到AppDomain?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM