C# 我可以指定<;的绝对位置吗;entityFramework>&书信电报;提供商>&书信电报;供应商>;在App.config中
我正在为应用程序(ESRI ArcMap)开发一个外接程序库。同时,我想使用EF6作为数据库访问。我的问题是,应用程序每次执行C# 我可以指定<;的绝对位置吗;entityFramework>&书信电报;提供商>&书信电报;供应商>;在App.config中,c#,.net,entity-framework-6,devart,dll-reference,C#,.net,Entity Framework 6,Devart,Dll Reference,我正在为应用程序(ESRI ArcMap)开发一个外接程序库。同时,我想使用EF6作为数据库访问。我的问题是,应用程序每次执行dbProviderFactorys.GetFactory(“Devart.Data.Oracle”)时都会崩溃,并且会提示一个错误,因为Devart.Data.Oracle未能找到或加载已注册的.Net Framework数据提供程序。 我确信所有必需的库都与主加载项DLL放在同一文件夹中。但是,主应用程序exe与外接程序DLL不在同一位置。应用程序似乎通过单独搜索外接
dbProviderFactorys.GetFactory(“Devart.Data.Oracle”)
时都会崩溃,并且会提示一个错误,因为Devart.Data.Oracle未能找到或加载已注册的.Net Framework数据提供程序。
我确信所有必需的库都与主加载项DLL放在同一文件夹中。但是,主应用程序exe与外接程序DLL不在同一位置。应用程序似乎通过单独搜索外接程序文件夹来加载其外接程序DLL
我的观察是,dbProviderFactorys.GetFactory
只在exe所在的文件夹中搜索提供程序DLL。因此,它找不到位于外接程序文件夹中的提供程序DLL。我可以知道是否有任何方法可以指定应该在哪里dbProviderFactorys.GetFactory
搜索提供程序DLL吗
提前感谢。DBProviderFactorys注册代码:
<entityFramework>
<providers>
<provider invariantName="Devart.Data.Oracle" type="Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity.EF6, Version=9.14.1204.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
从您的子域名加载Devart.*程序集:
private static void InitDbProvFactEntry() {
bool DevartProviderRegistered = false;
var dataSet = System.Configuration.ConfigurationManager.GetSection("system.data") as System.Data.DataSet;
foreach (System.Data.DataRow dr in dataSet.Tables[0].Rows) {
if ((string)dr[2] == "Devart.Data.Oracle") {
DevartProviderRegistered = true;
}
}
if (!DevartProviderRegistered) {
dataSet.Tables[0].Rows.Add("dotConnect for Oracle"
, "Devart dotConnect for Oracle"
, "Devart.Data.Oracle"
,
"Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=" + Devart.Data.Oracle.ProductInfo.Version + ", Culture=neutral, PublicKeyToken=09af7300eec23701");
}
}
非常感谢你的帮助。试过了,效果很好
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
...
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
var assemblyName = new AssemblyName(args.Name);
if (assemblyName.Name.StartsWith("Devart.")) {
var assembly = Assembly.GetExecutingAssembly();
string directory = System.IO.Path.GetDirectoryName(assembly.Location);
string newPath = Path.Combine(directory, "YourSubDirName");
var files = Directory.EnumerateFiles(newPath);
string targetDllName = assemblyName.Name + ".dll";
if (files.Any(name => name.EndsWith(targetDllName))) {
string fullFilePath = Path.Combine(newPath, targetDllName);
return Assembly.LoadFrom(fullFilePath);
}
}
return null;
}