【发布时间】:2020-01-10 19:07:46
【问题描述】:
我有一个 .net Core 3.0 应用程序试图通过反射调用 .Net Framework 4.8。我们的目标是使用 ConfigurationManager 读取加密的 AppSettings.config (xml),这在 .Net Core 中是不可能的。未加密是,但加密(CipherData),否。
我的访问静态类和方法的反射代码如下:
Assembly assembly = Assembly.LoadFrom(exeFullName);
MethodInfo method = assembly.GetType(nameSpacenClass).GetMethod(methodName);
if (method != null)
{
object rtnVal = method.Invoke(null, new object[] { jsonParms });
return rtnVal;
}
else
return null;
method.Invoke 出错并显示以下异常消息: FileNotFoundException:无法加载文件或程序集 'System.Configuration.ConfigurationManager,Version=4.0.2.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51'。系统找不到指定的文件。
于是我在 .Net Framework 4.8 中编写了一个代理程序,并使用相同的代码访问通过反射读取加密配置的代码,它工作正常。
然后,我编写了 .net Core 3.0 以通过反射访问该代理,但它失败了。代理 .Net Framework 4.8 没有任何引用。它是准系统。然而,即使代理不需要,核心仍然需要 ConfigurationManager。 Config 程序只有一个引用 - System.Configuration。
Core 3.0 => 加密的 App.config => 失败
Core 3.0 => ConfigProgram 4.8 => App.Config => 失败
ConfigProgram 4.8 => App.config => 作品
Proxy 4.8 => ConfigProgram 4.8 => App.Config => Works
Core 3.0 => Proxy 4.8 => ConfigProgram 4.8 => App.Config => 失败
我猜想引用的 System.Configuration 不是 4.8 的反射调用所必需的,但即使是通过准系统的垫脚石,.Net Core 3.0 也需要它。有人可以帮帮我吗?
【问题讨论】:
-
出于兴趣,为什么不在 .NET Framework 4.8 中开发?你只需要CipherData吗?它似乎从 .NET Core 2.0 开始就受到支持。
-
这可行,但我们有兴趣使用核心技术。除了加密是个问题。
-
经验法则是仅使用 .NET Core 兼容的依赖项(因此 .NET Framework 程序集超出范围)。您在上面测试的是灰色区域,例如 this blog post 中的“从 .NET Standard 引用 .NET Framework 库”,所以您是在给自己挖一个坑。
标签: c# asp.net .net asp.net-core .net-core