C# 我可以指定<;的绝对位置吗;entityFramework>&书信电报;提供商>&书信电报;供应商>;在App.config中

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不在同一位置。应用程序似乎通过单独搜索外接

我正在为应用程序(ESRI ArcMap)开发一个外接程序库。同时,我想使用EF6作为数据库访问。我的问题是,应用程序每次执行
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;
    }