通过反射调用.NET Framework 4.8程序的.NET Core 3.0

3

我需要翻译的是关于IT技术的内容,您的.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;

该方法使用反射读取加密配置信息时出错,报错信息如下: 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 没有任何引用。它是裸机的。但是,即使代理没有要求,Core 仍然需要 ConfigurationManager。ConfigProgram 只有一个引用 - System.Configuration。
Core 3.0 => 加密 App.config => 失败
Core 3.0 => ConfigProgram 4.8 => App.Config => 失败
ConfigProgram 4.8 => App.config => 可行
代理 4.8 => ConfigProgram 4.8 => App.Config => 可行 Core 3.0 => 代理 4.8 => ConfigProgram 4.8 => App.Config => 失败
我猜测,虽然 4.8 的反射调用不需要引用 System.Configuration,但通过裸机中间步骤 .NET Core 3.0 仍然需要。请问有谁能帮帮我?

出于兴趣,为什么不直接在.NET Framework 4.8中开发呢?你只需要CipherData吗?它似乎从.NET Core 2.0开始就得到了支持。 - ProgrammingLlama
那样做是可行的,但我们有兴趣使用核心技术。除了加密是个问题。 - Yogi
1
原则是只使用与.NET Core兼容的依赖项(因此,.NET Framework程序集不在范围内)。你上面测试的是一个灰色地带,就像这篇博文中提到的“从.NET Standard引用.NET Framework库”,所以你正在自找麻烦。 - Lex Li
2个回答

5
当你通过反射在.NET Core上加载一个为.NET Framework构建的程序集时,它不会加载任何.NET Framework的部分,只会加载你的程序集(用户代码)。而一些部分可能无法正常工作。在你的情况下,它失败的原因是编译为.NET Framework的代码所请求的类/程序集不是.NET Core的一部分。
这就是为什么只有在你启动.NET Framework应用程序并启动.NET Framework运行时的情况下才能使用。

1
此使用加密配置文件的问题现已过时。通过.NET Core 3.1更新和.NET 6及以上版本,任何应用程序都将能够以与读取未加密文件相同的方式读取Cipher-Encrypted配置文件。对于XML配置文件,我们可以这样读取它:
    string assemblyName = Assembly.GetAssembly(this.GetType())?.GetName().Name;
    ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
    configFile.ExeConfigFilename = Path.Combine(dir, $"{assemblyName}.dll.config");
    Configuration configCollection = ConfigurationManager.OpenMappedExeConfiguration(configFile, ConfigurationUserLevel.None);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接