Eu tenho o seguinte código em 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"); ;
}
Quando testei usando um projeto (MAUI no meu caso) na mesma solução, funcionou bem. No entanto, ao empacotá-lo e carregá-lo no Nuget (por meio de nosso feed privado do Github Nuget), chamar SetLaunchCount
sempre throw e o rastreamento de pilha mostra call to ThrowOnReleaseBuild
.
Verifiquei duas vezes e a compilação de depuração realmente possui DEBUG
símbolo (e mais precisamente, nenhum RELEASE
símbolo):
Também tentei adicionar outro Debug.WriteLine
método para confirmar:
Por que não está funcionando? Verifiquei o código-fonte (descompilado), Debug.WriteLine
por exemplo, e ele está codificado exatamente como meu método:
[Conditional("DEBUG")]
public static void WriteLine(string? message) =>
s_provider.WriteLine(message);
EDIT: adicionando mais algumas informações:
A biblioteca foi construída no perfil Release.
Veja esta resposta na minha pergunta anterior sobre o uso de
Conditional
. De alguma forma, não funciona agora.
Funciona conforme o esperado. Na documentação você pode ler (ênfase minha) que
Portanto, quando você usa
Debug.WriteLine
e compila seu código com o sinalizador RELEASE ou DEBUG, não é que o código dentro deleDebug.WriteLine
seja removido. É a chamada em si que não existe - é por isso que "funciona".Então, no seu caso: No modo DEBUG, o
SetLaunchCount
método é afetado da seguinte maneira:Quando você empacota isso no NuGet no modo Release, o método está lá e se você compilar seu código em DEBUG ou RELEASE não o afeta, pois não é o seu código que chama o método que está marcado como atributo
Conditional
. Você só chamaSetLaunchCount
.Se você tornasse o método
ThrowOnReleaseBuild
público e o chamasse a partir do seu código, mesmo que estivesse no Nuget - funcionaria como esperado, pois a chamada para esse método estaria lá ou não, dependendo da condição.