我不想修改我的machine.config,但我想使用Npgsql库作为数据提供者。我将部署我的应用程序到多个平台(包括单声道),所以我真的很喜欢“只是工作”,而不是给我错误“无法找到所需的.Net Framework数据提供程序”。有没有办法在运行时动态加载数据提供者?
有没有办法在运行时“注册”Npgsql作为数据提供程序,所以这不会发生?
我应该澄清,Npgsql在大多数情况下都不会出现在我的machine.config中,但它有一些不适用于(比如NLog--我当前的挫折感)。
我不想修改我的machine.config,但我想使用Npgsql库作为数据提供者。我将部署我的应用程序到多个平台(包括单声道),所以我真的很喜欢“只是工作”,而不是给我错误“无法找到所需的.Net Framework数据提供程序”。有没有办法在运行时动态加载数据提供者?
有没有办法在运行时“注册”Npgsql作为数据提供程序,所以这不会发生?
我应该澄清,Npgsql在大多数情况下都不会出现在我的machine.config中,但它有一些不适用于(比如NLog--我当前的挫折感)。
我发现如何做我需要做的事情;它不是很“运行时”,但足够接近,我不必修改我的machine.config。我将这部分添加到我的web.config文件中:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" description=".NET Framework Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
...并且它开始像冠军一样工作。
您将不得不求助于使用反射(代码是为Microsoft .NET Framework,因此您将不得不验证专用字段是否在Mono中相同)。
using System.Data.Common;
// 1. Initialize the default configuration
DbProviderFactories.GetFactoryClasses();
// 2. Retrieve the configuration table.
var config = (DataTable)typeof(DbProviderFactories).GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
// 3. Add a new entry in the configuration (replace the values with ones for your provider).
DataRow dataRow = config.NewRow();
dataRow["Name"] = "SqlClient Data Provider";
dataRow["InvariantName"] = typeof(SqlConnection).Namespace.ToString();
dataRow["Description"] = ".Net Framework Data Provider for SqlServer";
dataRow["AssemblyQualifiedName"] = typeof(SqlConnection).AssemblyQualifiedName;
config.Rows.Add(dataRow);
我会试试这个,谢谢。 –
这似乎没有做任何事情。是否有可能需要重新初始化提供程序工厂列表的另一个命令? –