LINQPad从自定义库访问Sql Output Writer

时间:2015-02-10 08:02:57

标签: sql linq linqpad

我已经编写了一个库,我经常使用和不使用LINQPad。库(DLL)生成SQL和表达式,如果库在LINQPad-Query中执行,我想将SQL写入LINQPad的SqlOutputWriter。

我已经完成了以下操作,它在LINQPad< = 4.51.03中运行良好,但已停止使用最新的Betas> = 4.53,其中查询的执行引擎已更改。

            if (AppDomain.CurrentDomain.FriendlyName.Contains("LINQPad Query Server"))
        {
            var linqPadAssembly =
                AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(ass => ass.GetName().Name == "LINQPad");

            if (linqPadAssembly != null)
            {
                var utilType = linqPadAssembly.GetTypes().SingleOrDefault(t => t.FullName == "LINQPad.Util");

                if (utilType != null)
                {
                    var sqlWriterMember =
                        (PropertyInfo)utilType.GetMembers().SingleOrDefault(x => x.Name == "SqlOutputWriter");

                    if (sqlWriterMember != null)
                    {
                        var writer = (TextWriter)sqlWriterMember.GetValue(null, new object[0]);
                        new TextWriterCommandDumper(writer).Dump(cmd);
                    }
                }
                else
                {
                    Console.WriteLine("Could not load util class!");
                }
            }
        }

是否有正确的方式来动态访问LINQPad.Utils?

1 个答案:

答案 0 :(得分:1)

首先,如果您更改

,我认为您可以修复当前的代码
var utilType = linqPadAssembly.GetTypes().SingleOrDefault(t => t.FullName == "LINQPad.Util");

var utilType = linqPadAssembly.GetType("LINQPad.Util");


话虽如此,我更喜欢这样做的方法是在调用库中包含对LinqPad.exe的引用,并以这样的方式包装它,即使Linqpad在运行时不存在它仍会运行。

此方法仍适用于4.53.09

有时您想要使用仅在LinqPad下运行时才有意义的功能(如您的示例中所示),有时您希望使用LinqPad的功能(如果它在运行时可用)(即使您在外面运行) LinqPad)

我已经包含了一个示例包装器,显示了两个示例。

public class Wrapper
{

    public static System.IO.TextWriter GetSqlOutputWriter()
    {
        if (AppDomain.CurrentDomain.FriendlyName.Contains("LINQPad Query Server"))
            return InternalClass.GetSqlOutputWriter();
        else return Console.Out;
    }

    public static System.IO.TextWriter GetXhmtlWriter()
    {
        try
        {
            return InternalClass.CreateXHmtlWriter();
        }
        catch (Exception) {}

        return null;
    }


    class InternalClass
    {
        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
        public static System.IO.TextWriter GetSqlOutputWriter()
        {
            return LINQPad.Util.SqlOutputWriter;
        }

        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
        public static System.IO.TextWriter CreateXHmtlWriter()
        {
            return LINQPad.Util.CreateXhtmlWriter();
        }
    }

可以在

中调用第一种方法
  var writer = Wrapper.GetSqlOutputWriter();

  writer1.WriteLine("Hello");

如果您在LinqPad下运行,它将输出到Sql Output窗口,否则输出到控制台。

第二种方法检测Linqpad是否可用,可以像

一样使用
var writer = Wrapper.GetXhmtlWriter();

if (writer != null)
{
    writer.WriteLine( ... );
    var results = writer.ToString();
    ...
}
else
{
     // Linqpad not found.
     ...
}