c# - 有没有办法在 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# 交互中运行它:
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”加载它。
推荐阅读
- java - 在 Spring Boot 应用程序上增加 max-http-header-size 是否存在危险/影响?
- sql - 这个带有 TypeORM 的查询可以有 SQL 注入吗?
- automation - 是否有任何苹果脚本将任务控制键盘选项设置为空?
- css - 轮播卡无法使用 React 引导程序工作
- excel - MS Excel:在字符串中的第 N 个和第 N 个字符之间提取
- gravity-forms-plugin - 使用 GFAPI::submit_form 提交带有多个选项的复选框
- azure - Azure API 管理后端服务与 URL
- android - 运行颤振医生时出现错误尝试卸载所有内容,但再次安装后出现此错误
- arrays - 如何在 rust 中设置子数组
- spartacus-storefront - sparatcus v3.x 中 AuthActions.LOAD_USER_TOKEN_FAIL 的替代方法是什么