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.
...
}
我写了一个库,我经常使用和不使用 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.
...
}