从一个.NET库中,如何检查RUNNING assemblyapp是否在Debug构建中(不附加Debugger)?

我正在做一个类库 Foo (如果相关的话,Xamarin Android库,但如果可能的话,我更喜欢一般的.NET解决方案),我需要这样的东西。

if (builtInDebugConfig) 
{
    this.DoSomething();
}

现在 Foo.dll 当调用上述代码时,肯定会以Release模式编译。因此 #if 是不可能肯定的。Conditional 应该也不行(如果我说错了,请纠正我,我读到过这也是编译器的属性 (问题的答案和我的测试都证实了) Conditional 作品)。) 我能想到的最接近的是 Debugger.IsAttached然而,大多数时候,我们在测试应用程序时都没有连接调试器。

有什么办法可以检测到 呼叫 集合体被编译成 DEBUG symbolconfig? 如果可能的话,我不希望调用(app)代码在每个app中都有这样的东西,因为这违背了目的。

#if DEBUG
    Foo.IsDebug = true;
#endif

更新: 澄清我为什么要这样做。如果调用的应用程序是在开发中,我想启用Debug代码(即启用WebView调试信号),而不希望这样的代码存在于最终视图中。这就是为什么我对防止此类代码泄露到Release构建中的解决方案感兴趣。

解决方案:

你可以使用 ConditionalFoo 来装饰一个方法–对该方法的任何调用都将取决于是否使用了 呼叫 代码定义了相关的符号。所以类似于。

[Conditional("DEBUG")]
public void MaybeSetDebugMode()
{
    // Remember the decision
}

那么调用代码就可以无条件的写代码调用 MaybeSetDebugMode呼叫只会 其实 编入 DEBUG 是在编译调用代码时定义的。中的方法。Foo 本身将被编译成 Foo.dll 无论你在编译时定义的符号是什么。

这和 #if,其中 是否 当你编译代码时,依赖于符号。

请注意,这就是 Debug.WriteLine 等工作。

这样做的一个缺点是:这段代码 绝对 会存在于 “最终构建 “中,除非你采取更多的行动。它必须存在,因为Foo.dll中代码的存在不能因为调用它的东西而改变。

所以你 居然要用 #if 而不是,例如。

#if FINAL_BUILD
public void MaybeSetDebugMode()
{
    // This method exists so that the calling code will still build
    // with the final DLL, but there won't be any "interesting" code
    // for anyone to find.
}

#else

public void MaybeSetDebugMode()
{
    // Interesting code goes here. This code won't be included in the final build,
    // but callers can call it unconditionally, because there'll be an empty
    // method in the final build.
}
#endif

给TA打赏
共{{data.count}}人
人已打赏
未分类

事件总线 - 创建多个事件

2022-9-13 14:29:30

未分类

有什么方法可以用scandir循环文件夹?我面临一个问题,当循环使用

2022-9-13 14:40:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索