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