我有以下代码MyLib.dll
:
[Obsolete("This method is for debugging only. Remove all calls to this method once done.")]
public void SetLaunchCount(int count)
{
ThrowOnReleaseBuild();
launchEntry.Set(count);
}
[Conditional("RELEASE")]
static void ThrowOnReleaseBuild()
{
throw new InvalidOperationException("This method must not be called outside of DEBUG build"); ;
}
当我在同一解决方案中使用项目(在我的例子中为 MAUI)测试它时,它工作得很好。然而,当打包它并将其上传到 Nuget(通过我们的私有 Github Nuget feed)时,调用SetLaunchCount
总是抛出并且堆栈跟踪显示对ThrowOnReleaseBuild
.
我已经仔细检查过,调试版本确实有DEBUG
符号(更准确地说,没有RELEASE
符号):
我还尝试添加另一种Debug.WriteLine
方法来确认:
为什么它不起作用?Debug.WriteLine
我检查了例如(反编译的)源代码,它的编码就像我的方法一样:
[Conditional("DEBUG")]
public static void WriteLine(string? message) =>
s_provider.WriteLine(message);
编辑:添加更多信息:
该库是在发布配置文件中构建的。
请参阅我之前有关使用的问题的答案
Conditional
。不知怎的,现在不起作用了。
它按预期工作。从文档中您可以读到(强调我的)
因此,当您使用
Debug.WriteLine
RELEASE 或 DEBUG 标志编译代码时,并不是Debug.WriteLine
删除了其中的代码。这是调用本身不存在 - 这就是为什么“它有效”。因此,在您的情况下:在调试模式下,该
SetLaunchCount
方法会受到以下影响:当您在发布模式下将其打包到 NuGet 中时,该方法就在那里,如果您在 DEBUG 或 RELEASE 中编译代码,则不会影响它,因为不是您的代码调用标记为属性的方法
Conditional
。你只需要打电话SetLaunchCount
。如果您将方法
ThrowOnReleaseBuild
公开并从代码中调用它,即使它位于 Nuget 中 - 它也会按照您的预期工作,因为对该方法的调用将存在或不存在,具体取决于条件。