LINQPad 从自定义库访问 Sql Output Writer

LINQPad access SqlOutputWriter from custome library

我写了一个库,我经常使用和不使用 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 的正确方法?

首先,我认为如果您更改

就可以修复当前代码
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输出window,否则输出到控制台

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

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

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