我很难将控制台应用程序从.NET Framework 4.6.2移植到.NET Core 2.0。应用程序需要连接到在编译时未知平台的数据库。在完整的框架中,通过使用.NET Core 2.0中不再存在的DbProviderFactories
机制可以轻松实现这一点。
首先,我想我可以自己动态加载相应的DbProviderFactory
,使用类似的代码:
public static DbProviderFactory GetFactory(string providerInvariantName)
{
Type type = Type.GetType(dbProvider.Type);
if (null != type)
{
FieldInfo field = type.GetField("Instance", BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public);
if (null != field && field.FieldType.IsSubclassOf(typeof(DbProviderFactory)))
{
object value = field.GetValue(null);
if (value != null)
{
return (DbProviderFactory)value;
}
}
}
}
完成in this library here。只要在编译时引用包含DbProviderFactory
的程序集(这种方法违背动态加载的目的),此代码就可以正常工作。
我尝试将System.Data.SqlClient.dll
放入应用的文件夹,但Instance
字段为null
,因为这似乎只是不同runtimes
的存根实现组件。静态引用时,编译器会发出一个指向那些的详细.deps.json
文件。这只是一个很小的尝试,给人留下印象:
...
"runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==",
"path": "runtime.win-x64.runtime.native.system.data.sqlclient.sni/4.4.0",
"hashPath": "runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
},
"runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==",
"path": "runtime.win-x86.runtime.native.system.data.sqlclient.sni/4.4.0",
"hashPath": "runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
},
...
这不是某人可以手动输入的内容。
那么在.NET Core中开发与数据库无关的应用程序会是什么好方法呢?