首页 > 解决方案 > 有没有办法在 C# 交互中初始化 web.config?

问题描述

我有一个我目前正在处理的 ASP.NET MVC 项目。我想在 C# 交互中尝试一些代码,我单击“初始化与项目交互”。我可以在 c# 交互中看到变量、类和其他东西。

现在一件事被打破了,通过 web.config 定义的静态变量正在抛出异常。

如果我粘贴使用 web.config 变量的代码(在交互式窗口中)不起作用。无论如何要解决这个问题。

我检查了 SeM 的答案,我检查了 appsettings 它什么都没有 在此处输入图像描述

更新2:

我在 github 上设置了代码并阅读了答案中给出的 appsettings,但仍然没有工作,代码在这里https://github.com/anirugu/CsharpInteractiveTesting

标签: c#interactive

解决方案


C# interactive 本身作为具有单独应用程序配置文件的单独应用程序运行。如果你在 C# 交互中运行它:

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

你会看到类似的东西:

"<path to VS>\\CommonExtensions\\Microsoft\\ManagedLanguages\\VBCSharp\\InteractiveComponents\\InteractiveHost.exe.Config"

这就是正在使用的配置文件。当然它不包含您的变量,因此尝试执行的代码会ConfigurationManager.AppSettings["foo"].ToString()失败。

在运行时设置配置文件的常用方法是:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", fullPathToYourConfig);

但是,这应该在访问配置文件之前完成。首次访问时 - 正在缓存文件,随后对路径的更改将无效。不幸的是,在允许您访问执行命令之前,C# interactive 已经使用该文件。

有各种带有反射的技巧来重置该缓存。例如(从这里逐字复制):

public static void ChangeConfigTo(string path)
{
    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
    typeof(ConfigurationManager)
        .GetField("s_initState", BindingFlags.NonPublic |
            BindingFlags.Static)
        .SetValue(null, 0);

    typeof(ConfigurationManager)
        .GetField("s_configSystem", BindingFlags.NonPublic |
            BindingFlags.Static)
        .SetValue(null, null);

    typeof(ConfigurationManager)
        .Assembly.GetTypes()
        .Where(x => x.FullName ==
            "System.Configuration.ClientConfigPaths")
        .First()
        .GetField("s_current", BindingFlags.NonPublic |
            BindingFlags.Static)
        .SetValue(null, null);
}

考虑到所有这些,如果您将该函数Program放在 github 上的示例中的类中,并在 C# 交互中执行此操作:

Program.ChangeConfigTo(Path.GetFullPath("app.config"));

您的代码将按预期工作。您可以将此 hack 放在单独的脚本 ( .csx) 文件中,并在必要时使用“#load”加载它。


推荐阅读