【问题标题】:Access to .config files in Roslyn REPL访问 Roslyn REPL 中的 .config 文件
【发布时间】:2017-10-14 13:38:50
【问题描述】:

使用Roslyn June 2012 CTP

有没有办法为 Roslyn C# Interactive/REPL 提供 .config 文件以供正在探索的代码使用?一个简单的示例场景是依赖于通常从 app.config/web.config 获得的连接字符串的代码。

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    目前还没有办法做到这一点,尽管我们正在为未来考虑。

    与此同时,您能否将您的代码分解为将连接字符串作为参数,然后将其传递给交互式窗口中的方法?

    【讨论】:

    • 谢谢凯文,这就是我最终做的。我希望 .config 功能使其成为 REPL 的未来版本,因为我遇到了相当多的依赖于配置文件的代码。顺便说一句 - 我非常喜欢你们对 Roslyn 所做的事情,这太棒了!
    • 我想补充一点:拥有类似 C# 脚本语言的东西可以替换 .config 文件之类的东西,并且通常可以应用于依赖注入。想象一下脚本文件与二进制文件一起部署,并且在启动时它可以执行脚本并将返回的任何内容加载到 ConfigurationManager 或其他任何内容中。依赖注入的工作方式类似,只需调用脚本来解析需要调用哪些构造函数/属性来实例化特定对象。所以基本上,+1M 投票支持在 Roslyn 使用 .config(这是朝着正确方向迈出的一小步)。
    【解决方案2】:

    现在这实际上是可能的(并且可能在被问到这个问题的时候就已经实现了)。只需使用以下内容创建一个 LoadConfig.csx 文件:

    #r "System.Configuration"
    
    using System;
    using System.IO;
    using System.Linq;
    
    
    var paths = new[] { Path.Combine(Environment.CurrentDirectory, "Web.config"), Path.Combine(Environment.CurrentDirectory, "App.config") };
    var configPath = paths.FirstOrDefault(p => File.Exists(p));
    
    if (configPath != null)
    {
        // Set new configuration path
        AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configPath);  
    
        // Reset current configuration load state
        var t = typeof(System.Configuration.ConfigurationManager);
        var f = t.GetField("s_initState", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
        f.SetValue(null, 0);
    }
    

    将文件保存在您会记住的位置,然后返回到您要在 Visual Studio 中加载的项目。右键单击项目并选择“从项目中重置 C# Interactive”。一旦 C# 交互式窗口完成加载调用:

    #load "C:\path\to\LoadConfig.csx"
    

    注意:您必须在加载项目后立即调用它。如果在加载此脚本之前发生任何配置查找,则此脚本将无法工作。

    现在 C# 交互窗口应该可以访问您的项目设置了。

    【讨论】:

    • 只是好奇这是否适用于其他人?似乎对我不起作用。这是一个悲剧,因为它将所有从配置文件中获取连接字符串信息的程序集渲染为无法从 C# 交互式窗口中测试。这可能是一个非常有用的工具,到目前为止,它对我来说几乎毫无用处。
    • 对我也不起作用。我正在使用 Visual Studio 2017
    【解决方案3】:

    已经接受的答案对我不起作用;根据接受答案的 cmets,它也不适用于其他 2 个。以下解决方案对我有用。

    1. 更新 C# Interactive (REPL) 的配置文件,位于

      AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

    2. 重新初始化 REPL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2018-01-10
      相关资源
      最近更新 更多