调试时是否可以声明 C# 方法/函数?
Is it possible to declare C# method / function while debugging?
假设您设想了一些扩展方法,可以将对象以某种方式转换为对调试有用的东西。一个例子是 sqlCommand.ToScript()
扩展方法,它将 return T-SQL 脚本版本的字符串执行(它会在脚本顶部声明参数等) .) 您希望该扩展方法(或至少某些函数/方法)在调试时可用,但您不想在您的代码库中实际定义它,因为它会让团队感到混乱。
我认为Immediate Window 不能定义函数,可以吗?有 C# Interactive Window,但它可以在我遇到断点后与当前正在执行的堆栈进行交互吗?
我听说 Reflection.Emit() 可以在 运行 时添加新代码。我能以某种方式使用它吗?
除了扩展 Immediate Window 或者为 VS 创建新的扩展,我可以想到以下解决方案让你有一些调试方法:
- 使用#if DEBUG + 部分 类 或扩展方法
- 使用条件引用+扩展方法
- 在即时 Window + 扩展方法中使用 Assembly.Load
我将分享上述每个解决方案的示例。
使用#if DEBUG + 部分 类 或扩展方法
您可以使用 #if DEBUG。对于代码库中的类型,您可以使用部分 classes 将调试方法分组到 class 的其他部分,如下所示:
public partial class MyClass
{
#if DEBUG
public string SaySomething()
{
return "Something!";
}
#endif
}
对于不属于您的类型,您可以使用这样的扩展方法(对于属于您的类型,您也可以使用此解决方案):
public static class SqlCommandExtensions
{
#if DEBUG
public static string SaySomething(this SqlCommand command)
{
return "Something!";
}
#endif
}
使用条件引用+扩展方法
如果您想将所有这些代码放在不同的库中,您可以创建一个 class 库并将扩展名 classes 放在全局命名空间(无命名空间)中,然后添加一个条件参考:
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<Reference Include="GlobalExtensions">
<HintPath>..\Somewhere\GlobalExtensions.dll</HintPath>
</Reference>
</ItemGroup>
在此解决方案中,您不需要调试。
public static class SqlCommandExtensions
{
public static string SaySomething(this SqlCommand command)
{
return "Something!";
}
}
在即时 Window + 扩展方法中使用 Assembly.Load
作为另一种选择,您可以创建另一个程序集,然后将这些扩展方法放在该程序集中的全局命名空间(无命名空间)中。然后不添加引用,只是在调试时,立即 window 你可以使用它们:
Assembly.LoadFile(@"C:\Somewhere\GlobalExtensions.dll")
yourSqlCommand.SaySomething()
在这个解决方案中,你不需要调试,你也不需要任何添加引用,它只在调试时和立即可用window:
public static class SqlCommandExtensions
{
public static string SaySomething(this SqlCommand command)
{
return "Something!";
}
}
您不会立即获得它的智能感知 Window,但它有效。
假设您设想了一些扩展方法,可以将对象以某种方式转换为对调试有用的东西。一个例子是 sqlCommand.ToScript()
扩展方法,它将 return T-SQL 脚本版本的字符串执行(它会在脚本顶部声明参数等) .) 您希望该扩展方法(或至少某些函数/方法)在调试时可用,但您不想在您的代码库中实际定义它,因为它会让团队感到混乱。
我认为Immediate Window 不能定义函数,可以吗?有 C# Interactive Window,但它可以在我遇到断点后与当前正在执行的堆栈进行交互吗?
我听说 Reflection.Emit() 可以在 运行 时添加新代码。我能以某种方式使用它吗?
除了扩展 Immediate Window 或者为 VS 创建新的扩展,我可以想到以下解决方案让你有一些调试方法:
- 使用#if DEBUG + 部分 类 或扩展方法
- 使用条件引用+扩展方法
- 在即时 Window + 扩展方法中使用 Assembly.Load
我将分享上述每个解决方案的示例。
使用#if DEBUG + 部分 类 或扩展方法
您可以使用 #if DEBUG。对于代码库中的类型,您可以使用部分 classes 将调试方法分组到 class 的其他部分,如下所示:
public partial class MyClass
{
#if DEBUG
public string SaySomething()
{
return "Something!";
}
#endif
}
对于不属于您的类型,您可以使用这样的扩展方法(对于属于您的类型,您也可以使用此解决方案):
public static class SqlCommandExtensions
{
#if DEBUG
public static string SaySomething(this SqlCommand command)
{
return "Something!";
}
#endif
}
使用条件引用+扩展方法
如果您想将所有这些代码放在不同的库中,您可以创建一个 class 库并将扩展名 classes 放在全局命名空间(无命名空间)中,然后添加一个条件参考:
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<Reference Include="GlobalExtensions">
<HintPath>..\Somewhere\GlobalExtensions.dll</HintPath>
</Reference>
</ItemGroup>
在此解决方案中,您不需要调试。
public static class SqlCommandExtensions
{
public static string SaySomething(this SqlCommand command)
{
return "Something!";
}
}
在即时 Window + 扩展方法中使用 Assembly.Load
作为另一种选择,您可以创建另一个程序集,然后将这些扩展方法放在该程序集中的全局命名空间(无命名空间)中。然后不添加引用,只是在调试时,立即 window 你可以使用它们:
Assembly.LoadFile(@"C:\Somewhere\GlobalExtensions.dll")
yourSqlCommand.SaySomething()
在这个解决方案中,你不需要调试,你也不需要任何添加引用,它只在调试时和立即可用window:
public static class SqlCommandExtensions
{
public static string SaySomething(this SqlCommand command)
{
return "Something!";
}
}
您不会立即获得它的智能感知 Window,但它有效。