Linuxプログラムで.dllは何をしていますか?


20

Linux用Unity3Dで作成されたゲームには.dll、データフォルダーにファイルが含まれていますGameDataFolder/Managed

Linuxは.soファイルの代わりに.dllファイルを使用すると思ったので、これは奇妙です。

(Android-Unity3Dアプリにも同じことが言えます。)

どうして?

回答:


25

あなたが話しているゲームは、.NET Frameworkに基づいており、Microsoftの.NET Frameworkの無料のオープンソース実装であるMonoで実行されています。

これらのアプリケーションは.NETベースであるため、アセンブリの拡張子は.dllです。そのため、フォルダー内のDLLファイルを確認できます。

クロスプラットフォーム用に設計された1つの.NETプログラムは、MSILでコンパイルされ、.NET / Monoランタイムを実行する必要がある同じ「バイナリ」(アセンブリでもあるDLLを含む)でWindows、Linux、またはMacで実行できます。 。

また、Ubuntuリポジトリで使用可能なMono Frameworkに基づいたいくつかの無料のアプリケーション(ゲームだけでなく)も持っていることに注意してください。例:おてんば娘。


11
また、これらのdllは「実際の」Windows dllではなく、実際にコンパイルされた.NETバイトコードであることに注意してください。
Sanya_Zol

5
また、.dllおよびなどのファイル拡張子.soは、Linuxでは無意味です。彼らは私たちの便宜のためにのみ使用されています。
code_dredd

1
@ray説明できますか?まだファイルタイプ情報を伝えるための標準だと思ったので、意味がないのではないでしょうか。
FMaz

2
@FynnMazurkiewicz:どちらかのシステムが実施する単一の中心的な属性というよりは、デザインの伝統がわずかに異なる問題です。実際、Windowsカーネル Linuxダイナミックリンカの両方は、ファイル名が.dllまたは.soで終わるかどうかに関係なく、(それぞれの形式で)共有ライブラリを喜んでロードします。歴史的な理由により、WindowsのLoadLibrary syscallは、拡張子がまだない場合にファイル名に「.dll」を追加することがありますが、通常は使用されません。
ヘニングマクホルム

1
@rayは完全でgccはありません。たとえば-lm、ファイル名がそのバージョン名のバージョンで終わらない場合.so.a、バージョン付きのバリアントがない場合など、提供されるライブラリは見つかりません。
ルスラン

9

.dll内のファイルGameDataFolder/Managed内部でモノを使用してネイティブコードのプログラムに属しています。

Unityゲームエンジンには Monoが組み込まれています(ほとんどのWindowsプラットフォームでも)。

.NET共通言語ランタイムまたはMonoで実行できるクロスプラットフォームの実行可能ファイルおよび共有ライブラリは、Windowsに固有ではない場合でも、多くの場合、それぞれサフィックス.exeおよび.dllサフィックスが付いています。.dllUbuntuのようなGNU / Linuxシステム、またはWindows以外のOSのプログラムでファイルを見つけるとき、これが通常の理由です。ほとんどの場合.dll、Ubuntuシステムで見つけますが、Golbothの答えはそれを説明しています。しかし、それはここで起こっていることではありません。

ユニティゲームエンジン - と混同すべきではない、ほとんどのUbuntuのリリースでは、デフォルトのグラフィカル・インターフェースは、人気の高い独自のクロスプラットフォームのゲームエンジンを--is。このエンジンは、.NET FrameworkまたはMonoの上では動作しませ代わりに、Monoが埋め込まれます。つまり、Monoはその上で実行されます。これは、開発者が、Unityエンジンの一部ではないゲームに必要なコードを作成する方法です。

一般に、Monoは、Microsoftの.NET CLRが通常使用されるのと同じ方法で使用され、完全な.NET / Monoプログラムを実行します。しかし、モノも容易になるように設計されたネイティブコードアプリケーションで埋め込みなど、カスタマイズするそれらのアプリケーションを有効にします。それはあなたが説明している状況で起こっていることです。表示されているファイルは、Monoまたは.NET CLRの上で直接実行されるプログラムに属していません。代わりに、Monoを埋め込むネイティブコードプログラムに属します。

UnityゲームエンジンがMonoを使用する方法

ほとんどがC ++で記述されているUnityゲームエンジンは、システムのパッケージマネージャーからインストールされたバージョン(存在する場合)を使用せず、異なるバージョンのMonoのインスタンスをホストします。この組み込みMonoランタイムは、目的ではないため、スタンドアロンの.NET / Monoプログラムの実行には使用できません。代わりに、エンジンのネイティブコード部分はそれを使用してCILコードを実行します。(CILはCommon Intermediate Languageであり、正式名称です。Microsoftが最初に開発したため、以前はMSILまたはMicrosoft Intermediate Languageと呼ばれていました。)Unityエンジンを使用するゲームを作成するプログラマーは通常、C#で独自のコードを記述しますサポートされています。

Unityエンジンは、WindowsにもMonoを埋め込みます。以下のためにユニバーサルのWindowsプラットフォームとなし、他のプラットフォーム- -ゲームではなく、モノのは、Microsoft .NET Frameworkを使用しています。ただし、ほとんどのモバイルデバイスやゲームコンソール、UbuntuやWindowsなど、ほとんどのプラットフォームのUnityゲームの大部分はMonoを使用しています。一部のプラットフォームでは、Monoの代替としてIL2CPPが利用可能であり、一部のIL2CPPのみがサポートされています。詳細については、スクリプトの制限を参照してください。

.dllUbuntuでファイルが表示されるその他の状況

.dllUbuntuでファイルが表示される可能性がある2つの状況について説明しました。

  1. .NET / Monoアプリケーションで使用することを目的とした共有ライブラリ。ゴルボスの答えはこれを詳細に説明しています。これは.dll、Ubuntuシステムで表示されるほとんどのものです。フォルダー内の.dllファイルが何のためにあるのかは偶然ではありませんGameDataFolder/Managed
  2. 組み込みMonoランタイムが使用するコードを提供するファイル。ネイティブコードアプリケーションに「スクリプト」を提供します。それがこの場合に起こっていることです。

.dllUbuntuでファイルが表示される可能性のある他の2つの合理的に一般的なケースがあります。

  1. .NET Coreのコンパイラーは、コンパイル対象がライブラリーでない場合でも、.dllファイルではなく.exeファイルを生成します。通常の.NET FrameworkやMonoではなく、.NET Coreランタイム(CoreCLRと呼ばれます)がこれらのファイルを実行します。.NET CoreはMicrosoft製品ですが、標準の.NET Frameworkとは異なり、.NET Coreは UbuntuのようなGNU / Linuxシステムを公式にサポートするクロスプラットフォームであり、無料のオープンソースソフトウェアです。
  2. .dllUbuntuで表示されるファイルは、Windowsライブラリである場合があります。これは、プログラムがUbuntuシステムに格納されているがWindowsで実行されている場合、またはUbuntuでWindowsドライブをマウントしている場合に表示されます。また、Wineを使用してUbuntuで実行できるプログラムや、Wineに付属するソフトウェアや、winetricks他のWindowsソフトウェアをサポートするために自動的にインストールされるプログラムに関連して表示される場合もあります。

これは.dll、Ubuntuで発生する可能性のあるすべての状況を網羅的にリストする試みではありません。(たとえば、OS / 2ライブラリでもかまいません。)ただし、これらの4つのケースは最も一般的なケースだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.