如何在T4文件中引用/使用必须在本地存在的程序集?

时间:2014-10-25 13:38:30

标签: .net entity-framework .net-assembly t4

我试图设置一个应该创建新DBContext对象的T4文件。配置从.config文件加载。

我使用DevartProvider而不是默认的SqlServerProvider,它通常在项目中将CopyLocal设置为True引用。

在使用

的T4模板文件中
<#@ assembly name="$(SolutionDir)\SomePath\Devart.Data.PostgreSql.Entity.dll" #>

但是在创建DBContext时,我得到一个Exception,因为找不到dll:

Additional information: The Entity Framework provider type 'Devart.Data.PostgreSql.Entity.PgSqlEntityProviderServices, Devart.Data.PostgreSql.Entity' registered in the application config file for the ADO.NET provider with invariant name 'Devart.Data.PostgreSql' could not be loaded Make sure that the assembly-qualified name is used and that the assembly is available to the running application.

我可以将DLL复制到执行T4的IDE文件夹(C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE),但由于此设置应该在多台计算机上运行,​​因此这种解决方法将是不可接受的。

如何在T4执行期间使此程序集可用?

1 个答案:

答案 0 :(得分:1)

我最终使用了 AppDomain.AssemblyResolve 委托(请参阅How to add folder to assembly search path at runtime in .NET)。对于以下代码的complettenes,还应提及Change default app.config at runtime

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += (sender, eventArgs) =>
{
    string lookupPath = @"PathToTheDllFolder";

    var assemblyname = new AssemblyName(eventArgs.Name).Name;
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
    var assembly = Assembly.LoadFrom(assemblyFileName);

    return assembly;
};

AppConfig.Change(@"PathToConfig.config");

var entities = new MyEntities();