我有一个我正在研究的ASP.NET MVC项目。我想在C#interactive中尝试一些代码,我点击“Initialize interactive with project”。我可以在c#interactive中看到变量,类和其他东西。
现在有一件事情已经破坏了,通过web.config定义的静态变量抛出了异常。
如果我粘贴使用web.config变量的代码(在交互式窗口中)不起作用。无论如何要解决这个问题。
更新2:
我在github上设置了代码,并在回答中给出了appsettings,但仍然没有用,代码在这里https://github.com/anirugu/CsharpInteractiveTesting
答案 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将为您完成所有操作。
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;加载它。如果有必要的话。