有没有办法在C#interactive中初始化web.config?

时间:2018-04-27 05:14:19

标签: c# interactive

我有一个我正在研究的ASP.NET MVC项目。我想在C#interactive中尝试一些代码,我点击“Initialize interactive with project”。我可以在c#interactive中看到变量,类和其他东西。

现在有一件事情已经破坏了,通过web.config定义的静态变量抛出了异常。

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

我检查了SeM的答案,并检查了它没有任何内容的应用程序enter image description here

更新2:

我在github上设置了代码,并在回答中给出了appsettings,但仍然没有用,代码在这里https://github.com/anirugu/CsharpInteractiveTesting

2 个答案:

答案 0 :(得分:2)

例如,如果您将设置添加到配置文件

<appSettings>
    <add key="Test" value="Test"/>
</appSettings>

并尝试通过ConfigurationManager读取它,它将抛出缺少引用的异常或

  

名称&#39; ConfigurationManager&#39;在当前上下文中不存在

在C#交互式窗口中,您可以引用包含关键字#r

的程序集
#r "System.Configuration"

然后你可以获得你的价值:

#r "System.Configuration"
var settings = ConfigurationManager.OpenExeConfiguration(@"bin\Debug\YourAppName.dll"); //You can use .exe files too
Console.WriteLine(settings.AppSettings.Settings["Test"].Value);

另外!您可以通过右键单击项目来添加项目的所有引用 - &gt;使用Projcet初始化交互,VS将为您完成所有操作。

更新

your example

using System.Configuration;
var settings = ConfigurationManager.OpenExeConfiguration(@"D:\TestProjects\CsharpInteractiveTesting-master\CsharpInteractiveTesting-master\CsharpInteractiveTesting\bin\Debug\CsharpInteractiveTesting.exe");
Console.WriteLine(settings.AppSettings.Settings["foo"].Value);

答案 1 :(得分:1)

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

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已经可以使用该文件了。

有各种带有反射的黑客可以重置该缓存。例如(从here逐字复制):

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);
}

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

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

您的代码将按预期工作。您可以将此hack放在单独的脚本(.csx)文件中,并使用&#34; #load&#34;加载它。如果有必要的话。