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