O que os .dlls estão fazendo nos programas Linux?

20

Os jogos criados com o Unity3D for Linux contêm .dllarquivos em suas pastas de dados GameDataFolder/Managed.

O que é estranho, porque eu pensei que o Linux usa .soarquivos em vez de .dllarquivos.

(O mesmo vale para aplicativos Android-Unity3D também.)

Por quê?

IronPig
fonte

Respostas:

25

Os jogos dos quais você está falando são baseados no .NET Framework e executados com o Mono, que é uma implementação gratuita e de código aberto do .NET Framework da Microsoft.

Como esses aplicativos são baseados no .NET, os assemblies têm extensão .dll. Então você pode ver os arquivos DLL nas pastas.

Um programa .NET projetado para uso em várias plataformas pode ser executado no Windows, Linux ou Mac, com os mesmos "binários" (incluindo DLLs que também são assemblies), compilados no MSIL e precisam de um tempo de execução .NET / Mono para serem executados .

Observe que você também tem alguns aplicativos gratuitos (não apenas jogos) baseados no Mono Framework disponíveis nos repositórios do Ubuntu. Por exemplo: Tomboy.

Golboth
fonte
11
Observe também que essas DLLs não são DLLs do Windows "reais", mas na verdade compilaram o bytecode do .NET.
Sanya_Zol 9/09/17
5
Observe também que as extensões de arquivo, incluindo .dlle .so, não fazem sentido no Linux. Eles são usados ​​apenas para nossa conveniência.
code_dredd
11
@ray Você pode explicar? Eu pensei que eles ainda são um padrão para transmitir informações de tipo de arquivo, portanto, não fazem sentido?
FMaz 9/09/17
2
@FynnMazurkiewicz: É mais uma questão de tradições de design ligeiramente diferentes do que um único atributo central que qualquer um dos sistemas impõe. Na verdade, tanto o kernel do Windows e o vinculador dinâmico Linux terá todo o prazer carregar uma biblioteca compartilhada (em seus respectivos formatos) não importa se seus nomes de arquivos termina em .dll ou .so ou outra coisa. Por razões históricas, o syscall do LoadLibrary no Windows, em alguns casos, anexará ".dll" ao nome do arquivo se ele ainda não tiver uma extensão, mas não é assim que costuma ser usado .
Henning Makholm 9/09/17
11
@ray não é bem assim: gccnão encontrará uma biblioteca fornecida como, por exemplo, -lmse o nome do arquivo não terminar com .soou .asuas variantes com versão.
Ruslan
9

Os .dllarquivos GameDataFolder/Managedpertencem a um programa de código nativo que usa o Mono internamente.

O mecanismo de jogo Unity incorpora o Mono (mesmo na maioria das plataformas Windows).

Os executáveis ​​de plataforma cruzada e as bibliotecas compartilhadas que podem ser executadas pelo .NET Common Language Runtime ou Mono geralmente são nomeados com .exee .dllsufixos, respectivamente, mesmo quando não são específicos para o Windows. Quando você encontra um .dllarquivo em um programa para um sistema GNU / Linux como o Ubuntu ou para qualquer sistema operacional, exceto o Windows, é geralmente por isso. Na maioria das vezes você encontra um .dllem um sistema Ubuntu, a resposta de Golboth explica isso. Mas não é bem isso que está acontecendo aqui.

O mecanismo de jogo Unity - que não deve ser confundido com a interface gráfica padrão na maioria das versões do Ubuntu - é um popular mecanismo de jogo multiplataforma proprietário. Esse mecanismo não é executado no .NET Framework ou no Mono. Em vez disso, ele incorpora o Mono , o que significa que o Mono é executado em cima dele. É assim que os desenvolvedores escrevem o código que seu jogo precisa que ainda não faz parte do mecanismo do Unity.

Em geral, o Mono pode ser usado da mesma maneira que o .NET CLR da Microsoft geralmente é usado, para executar programas .NET / Mono completos. Mas o Mono também foi projetado para ser facilmente incorporado em aplicativos de código nativo , inclusive para permitir que esses aplicativos sejam personalizados . É isso que está acontecendo na situação que você está descrevendo. Os arquivos que você está vendo não pertencem a um programa executado diretamente sobre o Mono ou o .NET CLR. Em vez disso, eles pertencem a um programa de código nativo que incorpora o Mono.

Como o Unity Game Engine usa mono

O mecanismo de jogo Unity, escrito principalmente em C ++, hospeda sua própria instância do Mono, que não usa - e pode ser diferente da - a versão (se houver) instalada através do gerenciador de pacotes do seu sistema. Esse tempo de execução Mono incorporado não pode ser usado para executar programas .NET / Mono independentes, porque esse não é o seu objetivo. Em vez disso, a parte do código nativo do mecanismo a utiliza para executar o código CIL. (CIL é Common Intermediate Language , que é seu nome oficial. Anteriormente, era chamado MSIL ou Microsoft Intermediate Language, desde que a Microsoft o desenvolveu originalmente.) Programadores que fazem jogos que usam o mecanismo Unity geralmente escrevem seu próprio código em C #, embora em outros idiomas. são suportados.

O mecanismo do Unity incorpora o Mono até no Windows. Para jogos da Plataforma Universal do Windows - e nenhuma outra plataforma - ele usa o Microsoft .NET Framework em vez do Mono. Mas a maioria dos jogos do Unity na maioria das plataformas, incluindo a maioria dos dispositivos móveis e consoles de jogos, incluindo o Ubuntu e o Windows, usa o Mono. Em algumas plataformas, o IL2CPP está disponível como alternativa ao Mono e, em algumas, apenas o IL2CPP é suportado. Consulte Restrições de script para obter detalhes.

Outras situações em que você pode ver .dllarquivos no Ubuntu

Duas situações em que você provavelmente verá um .dllarquivo no Ubuntu foram descritas:

  1. Uma biblioteca compartilhada que se destina a ser usada por um aplicativo .NET / Mono. A resposta de Golboth descreve isso em detalhes. Isto é o que a maioria dos .dlls você verá em um sistema Ubuntu. Simplesmente não é para isso que servem os .dllarquivos da sua GameDataFolder/Managedpasta.
  2. Um arquivo que fornece código usado por um tempo de execução Mono incorporado para fornecer "scripts" para um aplicativo de código nativo. É o que está acontecendo neste caso.

Existem outros dois casos razoavelmente comuns em que você pode ver um .dllarquivo no Ubuntu:

  1. O compilador para o .NET Core produz .dllarquivos e não .exearquivos, mesmo quando o que você está compilando não é uma biblioteca. O tempo de execução do .NET Core (chamado CoreCLR), e não o .NET Framework ou Mono comum, executa esses arquivos. O .NET Core é um produto da Microsoft, mas, diferentemente do .NET Framework padrão, o .NET Core é multiplataforma, com suporte oficial para sistemas GNU / Linux como o Ubuntu, e é um software de código aberto gratuito .
  2. Às vezes, um .dllarquivo que você vê no Ubuntu será apenas uma biblioteca do Windows. Você pode ver isso se o programa estiver sendo armazenado em um sistema Ubuntu, mas executado no Windows, ou se você montar uma unidade Windows no Ubuntu. Você também pode vê-lo em conexão com programas que podem ser executados no Ubuntu usando o Wine , incluindo software que acompanha o Wine ou com o qual você instala automaticamente winetrickspara oferecer suporte a outros softwares do Windows.

Esta não é uma tentativa de listar exaustivamente todas as circunstâncias em que você pode encontrar um .dllno Ubuntu. (Por exemplo, também pode ser uma biblioteca do OS / 2. ) No entanto, acredito que esses quatro casos sejam os mais comuns.

Eliah Kagan
fonte