![](/img/trans.png)
[英]How do I filter EF procedures by return type (e.g. via reflection or IL)?
[英]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的答復:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.