Ir para conteúdo
  • Cadastre-se

dev botao

Executável self-contained ACBrLib.Core.ACBrLibHandle - CodeBase is not supported on assemblies loaded from a single-file bundle.


Ver Solução Respondido por Renato Rubinho,

Recommended Posts

  • Membros Pro

Olá, estou iniciando com a utilização dos pacotes C# via Nuget e me deparei com o seguinte problema:

 

Minha applicação é distribuída para Linux e Windows via pacote self-contained (1 único binário), assim não temos dependências do dotnet runtime na máquina que executaremos a aplicação. Porém na classe ACBrLibHandle.cs tem um código que não é compatível com a aplicações self-contained.


Em modo de debug (localhost) funciona normalmente, porém quando vamos executar a aplicação compilada, recebo o seguinte erro:

Unhandled exception. System.TypeInitializationException: The type initializer for 'ACBrLib.Core.ACBrLibHandle' threw an exception.
 ---> System.NotSupportedException: CodeBase is not supported on assemblies loaded from a single-file bundle.
   at System.Reflection.RuntimeAssembly.get_CodeBase()
   at ACBrLib.Core.ACBrLibHandle..cctor() in /builds/app-back/src/ACBrLib.Core/ACBrLibHandle.cs:line 29
   --- End of inner exception stack trace ---
   at ACBrLib.Core.ACBrLibHandle.get_IsWindows() in /builds/app-back/src/ACBrLib.Core/ACBrLibHandle.cs:line 96
   at Application.Agent.WorkerService.AgentWorkerServiceStartup.CreatePlataformHostBuilder(String[] args) in /builds/app-back/src/Application.Agent.WorkerService/Program.cs:line 32
   at Application.Agent.WorkerService.AgentWorkerServiceStartup.Main(String[] args) in /builds/app-back/src/Application.Agent.WorkerService/Program.cs:line 22

 

Na ACBrLibHandle.cs hoje tem o seguinte código para definir o path padrão de carregamento das bibliotecas:

static ACBrLibHandle()
{
	MinusOne = new IntPtr(-1);

	var uri = new Uri(Assembly.GetEntryAssembly().CodeBase); // CodeBase não é suportado em self-contained
	var path = Path.GetDirectoryName(!uri.IsFile ? uri.ToString() : uri.LocalPath + Uri.UnescapeDataString(uri.Fragment));
	LibraryPath = Path.Combine(path, "ACBrLib", Environment.Is64BitProcess ? "x64" : "x86");
}

Acredito que algo assim resolveria o problema (estou utilizando esta versão hoje no meu fonte, porém não utilizo o path padrão das libs e sim seto o meu em tempo de execução via ACBrLibHandle.LibraryPath😞

static ACBrLibHandle()
{
	MinusOne = new IntPtr(-1);

	var baseDir = AppContext.BaseDirectory;
	if (!string.IsNullOrEmpty(baseDir))
	{
		var uri = new Uri(AppContext.BaseDirectory);
		var path = Path.GetDirectoryName(!uri.IsFile ? uri.ToString() : uri.LocalPath + Uri.UnescapeDataString(uri.Fragment));
		LibraryPath = Path.Combine(path, "ACBrLib", Environment.Is64BitProcess ? "x64" : "x86");
	}
}

 

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Consultores

Tópico movido para a área do SAC, para que o SLA de respostas seja considerado

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Consultores

Obrigado pela contribuição, em breve será validada para possível inclusão ao svn #TK-5375

  • Curtir 1
Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa noite,

Precisamos sempre tomar cuidado em manter a compatibilidade dos fontes com versões anteriores dos frameworks.

Eu efetuei um teste com os programas de exemplo que temos e não foi compatível.

Me corrija se eu estiver enganado, mas a sua sugestão não é compatível com .NET Framework 4.5.2, conforme informação extraída do link a seguir.

https://learn.microsoft.com/en-us/dotnet/api/system.appcontext

Applies to
Product	        Versions
.NET	        Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework	4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

Encontrei a opção AppDomain.CurrentDomain.BaseDirectory que parece atender à sua necessidade, mantendo a compatibilidade com versões anteriores.

https://learn.microsoft.com/pt-br/dotnet/api/system.appdomain

Applies to
Produto	        Versões
.NET	        Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework	1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

Com isso, o códgo final ficou conforme abaixo e funcionou corretamente nos nossos fontes atuais.

Segue o fonte com a alteração, por favor verifique se dessa forma funciona para a sua aplicação e nos confirme para enviarmos ao SVN.

Caso o problema persista e você tenha alguma outra sugestão que mantenha a compatibilidade com versões anteriores, nos envie para que possamos analisar.

static ACBrLibHandle()
{
    MinusOne = new IntPtr(-1);

    var baseDir = AppDomain.CurrentDomain.BaseDirectory;
    if (!string.IsNullOrEmpty(baseDir))
    {
        var uri = new Uri(baseDir);
        var path = Path.GetDirectoryName(!uri.IsFile ? uri.ToString() : uri.LocalPath + Uri.UnescapeDataString(uri.Fragment));
        LibraryPath = Path.Combine(path, "ACBrLib", Environment.Is64BitProcess ? "x64" : "x86");
    }
}

 

ACBrLibHandle.cs

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Boa noite, concordo com a sua solução também.

Como eu fiz um ajuste somente para minha aplicação funcionar não preciso me preocupar com compatibilidade de versões anteriores.

 

Sabem quando teremos essa solução dos fontes distribuidos no Nuget ?

 

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution
1 hora atrás, gostartlab disse:

Como eu fiz um ajuste somente para minha aplicação funcionar não preciso me preocupar com compatibilidade de versões anteriores.

Normal, eu disse que nós precisamos ter essa preocupação, justificando não aceitar sua contribuição e solicitando a validação da nova proposta se atenderia o seu cenário.

Foi gerado novo nuget 1.2.2 com a implementação, favor validar e reportar se funcionou como o esperado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Com a versão 1.2.2 deu certo.

Muito obrigado pessoal.

 

Só tenho mais 2 pontos que sentimos falta aqui nos pacote do Nuget, se devo abrir um novo tópico aqui no fórum sobre, por favor me avise que abro.

Na ACBrLib.Core.Config.PosPrinterConfig não tem a sessão Principal, é onde estamos configurando os logs.

E na ACBrLib.Sat.CodigoMP, não tem os pagamentos mpBoletoBancario, mpDepositoBancario, mpPagamentoInstantaneo e mpSemPagamento (https://portal.fazenda.sp.gov.br/_layouts/download.aspx?SourceUrl=/servicos/sat/Downloads/Especificacao_SAT_v_ER_2_30_03.pdf)

 

Mais uma vez obrigado.

Link para o comentário
Compartilhar em outros sites

  • Consultores
17 horas atrás, gostartlab disse:

Com a versão 1.2.2 deu certo.

Muito obrigado pessoal

Obrigado pelo retorno.

17 horas atrás, gostartlab disse:

Só tenho mais 2 pontos que sentimos falta aqui nos pacote do Nuget, se devo abrir um novo tópico aqui no fórum sobre, por favor me avise que abro.

Na ACBrLib.Core.Config.PosPrinterConfig não tem a sessão Principal, é onde estamos configurando os logs.

E na ACBrLib.Sat.CodigoMP, não tem os pagamentos mpBoletoBancario, mpDepositoBancario, mpPagamentoInstantaneo e mpSemPagamento (https://portal.fazenda.sp.gov.br/_layouts/download.aspx?SourceUrl=/servicos/sat/Downloads/Especificacao_SAT_v_ER_2_30_03.pdf)

Como são assuntos distintos e Libs diferentes, por favor abra um tópico para cada assunto detalhando cada problema.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.