Difference between revisions of "Modding Tutorials/Decompiling source code"

From RimWorld Wiki
Jump to navigation Jump to search
(Add Rider)
Line 1: Line 1:
 
{{BackToTutorials}}
 
{{BackToTutorials}}
{{Credit|[[User:Alistaire|Alistaire]]}}<br/>
 
  
The base game provides a bunch of code snippets in ''../Source/'', relative to your Rimworld installation. Since this isn't a lot, one might want to take a look at the game's full source code:<br/><br/>
+
The base game provides a bunch of code snippets in ''../Source/'', relative to your Rimworld installation. Since this isn't a lot, one might want to take a look at the game's full source code. RimWorld's [https://rimworldgame.com/eula/ EULA] allows you do to decompile the game for personal use. It's recommended to read it.
 +
 
 +
The following programs are used and recommended by modders:<br/><br/>
  
 
=Decompiling source code=
 
=Decompiling source code=
  
 
===dnSpy===
 
===dnSpy===
dnSpy is a great application for decompiling or debugging and is packed full of features. It even has a Visual Studio editor feel to it. It's currently only for Windows. It is also better than most other decompilers at iterator blocks and async/await methods.<br/>
+
dnSpy is a great application for decompiling or debugging and has a Visual Studio editor feel to it. It's currently only for Windows.<br/>
 
# Download [https://github.com/0xd4d/dnSpy/releases dnSpy] and extract it somewhere.
 
# Download [https://github.com/0xd4d/dnSpy/releases dnSpy] and extract it somewhere.
 
# Open dnSpy.exe. Once it's open, click "open" on the top ribbon (or press Ctrl+O).
 
# Open dnSpy.exe. Once it's open, click "open" on the top ribbon (or press Ctrl+O).
Line 18: Line 19:
 
One method is to use ILSpy. This software is recommended because its settings are correct on a clean install. It is for Windows only, but you can compile it yourself as a CLI application for Mono framework on OS X and Linux, see [https://github.com/icsharpcode/ILSpy/issues/691 (This issue)] or [https://github.com/icsharpcode/ILSpy/issues/416 (This issue)] on GitHub for more info.<br/>
 
One method is to use ILSpy. This software is recommended because its settings are correct on a clean install. It is for Windows only, but you can compile it yourself as a CLI application for Mono framework on OS X and Linux, see [https://github.com/icsharpcode/ILSpy/issues/691 (This issue)] or [https://github.com/icsharpcode/ILSpy/issues/416 (This issue)] on GitHub for more info.<br/>
  
# Download [http://ilspy.net/ ILSpy] (Download Binaries) and extract it to a directory of your choosing. Optionally create a desktop shortcut;
+
# Download [http://ilspy.net/ ILSpy] (Download latest release) and extract it to a directory of your choosing. Optionally create a desktop shortcut;
 
# '''Either''': associate the .dll extension with ILSpy:
 
# '''Either''': associate the .dll extension with ILSpy:
 
## Navigate to ''Assembly-CSharp.dll'' in ''../Rimworld***_Data/Managed/'', relative to your Rimworld installation and with *** being a version number;
 
## Navigate to ''Assembly-CSharp.dll'' in ''../Rimworld***_Data/Managed/'', relative to your Rimworld installation and with *** being a version number;
Line 31: Line 32:
 
## Ctrl+Shift+F or Ctrl+E opens the search bar which can be used to search through all loaded assemblies;
 
## Ctrl+Shift+F or Ctrl+E opens the search bar which can be used to search through all loaded assemblies;
 
## Ctrl+F opens a search bar for the currently opened decompiled class.<br/><br/>
 
## Ctrl+F opens a search bar for the currently opened decompiled class.<br/><br/>
 
Zhentar released an optimized version of ILSpy that decompiles iterators. It can be found [https://github.com/Zhentar/ILSpy/releases/ here].
 
  
 
===MonoDevelop===
 
===MonoDevelop===
Line 54: Line 53:
 
===Rider===
 
===Rider===
  
Rider is a cross-platform IDE with a built-in decompiler. If you're using Rider as your IDE ([[Modding_Tutorials/Setting_up_a_solution#Rider_.28works_on_Mac.29|Setup Instructions]]), you can view the source of any RimWorld class or method by right-clicking its name and clicking Go To > Definition.
+
Rider is a cross-platform IDE with a built-in decompiler. If you're using Rider as your IDE ([[Modding_Tutorials/Setting_up_a_solution#Rider_.28good_for_Mac.29|Setup Instructions]]), you can view the source of any RimWorld class or method by right-clicking its name and clicking Go To > Definition.
 +
 
 +
=How to make use of a decompiler=
 +
# Right-click any Type or Method and hit "analyse" to obtain more context on that item. 'Used by' and 'Uses' provide a lot of contextual clues which is required to know how things work.
 +
# RimWorld often uses reflection to instantiate Workers and MakeThings. This means no decompiler will cleanly find what/where an instance of a class is created. Hint: if you find yourself using 'new Pawn()', you're doing it wrong.
 +
# If you're going in circles trying to find things like "where is X assigned", odds are you'll need to look at the XML for it. The XML contains the data, C# does things with it.
  
 
=See also=
 
=See also=

Revision as of 13:28, 18 January 2019

Modding Tutorials

The base game provides a bunch of code snippets in ../Source/, relative to your Rimworld installation. Since this isn't a lot, one might want to take a look at the game's full source code. RimWorld's EULA allows you do to decompile the game for personal use. It's recommended to read it.

The following programs are used and recommended by modders:

Decompiling source code

dnSpy

dnSpy is a great application for decompiling or debugging and has a Visual Studio editor feel to it. It's currently only for Windows.

  1. Download dnSpy and extract it somewhere.
  2. Open dnSpy.exe. Once it's open, click "open" on the top ribbon (or press Ctrl+O).
  3. Navigate to ../Rimworld***_Data/Managed/, relative to your Rimworld installation and with *** being a version number.
  4. Ctrl+Shift+K to open the search bar.
  5. Explore the assembly and look through the source code to your heart's desire.

ILSpy

One method is to use ILSpy. This software is recommended because its settings are correct on a clean install. It is for Windows only, but you can compile it yourself as a CLI application for Mono framework on OS X and Linux, see (This issue) or (This issue) on GitHub for more info.

  1. Download ILSpy (Download latest release) and extract it to a directory of your choosing. Optionally create a desktop shortcut;
  2. Either: associate the .dll extension with ILSpy:
    1. Navigate to Assembly-CSharp.dll in ../Rimworld***_Data/Managed/, relative to your Rimworld installation and with *** being a version number;
    2. Right-click "Open with" and select a standard program. Navigate to your ILSpy installation and double-click ILSpy.exe, tick the checkbox and accept;
    3. Double-click Assembly-CSharp.dll,
  3. Or: open ILSpy and open a .dll:
    1. Open ILSpy;
    2. Go to File -> Open or press Ctrl+O, navigate to ../Rimworld***_Data/Managed/, relative to your Rimworld installation and with *** being a version number;
    3. Select Assembly-CSharp.dll and confirm,
  4. Click the "+" next to Assembly-CSharp (***), you will now see a list including the items Rimworld and Verse;
  5. Take your time to look through the source code, to make yourself familiar. If you ever need the source code, open ILSpy again:
    1. Ctrl+Shift+F or Ctrl+E opens the search bar which can be used to search through all loaded assemblies;
    2. Ctrl+F opens a search bar for the currently opened decompiled class.

MonoDevelop

MonoDevelop is capable of decompiling DLLs, albeit using clumsy initial settings. It is Linux only, otherwise you have to download Xamarin Studio which doesn't have a decompiler.

  1. Download MonoDevelop and install it;
  2. Either: associate the .dll extension with MonoDevelop:
    1. Navigate to Assembly-CSharp.dll in ../Rimworld***_Data/Managed/, relative to your Rimworld installation and with *** being a version number;
    2. Right-click "Open with" and select MonoDevelop as standard program;
    3. Double-click Assembly-CSharp.dll,
  3. Or: open MonoDevelop and open a .dll:
    1. Open MonoDevelop;
    2. Go to File -> Open, navigate to ../Rimworld***_Data/Managed/, relative to your Rimworld installation and with *** being a version number;
    3. Select Assembly-CSharp.dll and confirm,
  4. Very important: search for a dropdown called "Visibility" and change it from "Only public members" to "All members";
  5. Very important: search for a dropdown called "Language" and change it from "Summary" to "C#";
  6. Click the "+" next to Assembly-CSharp (***), you will now see a list including the items Rimworld and Verse;
  7. Take your time to look through the source code, to make yourself familiar. If you ever need the source code, open Assembly-CSharp.dll again.

Rider

Rider is a cross-platform IDE with a built-in decompiler. If you're using Rider as your IDE (Setup Instructions), you can view the source of any RimWorld class or method by right-clicking its name and clicking Go To > Definition.

How to make use of a decompiler

  1. Right-click any Type or Method and hit "analyse" to obtain more context on that item. 'Used by' and 'Uses' provide a lot of contextual clues which is required to know how things work.
  2. RimWorld often uses reflection to instantiate Workers and MakeThings. This means no decompiler will cleanly find what/where an instance of a class is created. Hint: if you find yourself using 'new Pawn()', you're doing it wrong.
  3. If you're going in circles trying to find things like "where is X assigned", odds are you'll need to look at the XML for it. The XML contains the data, C# does things with it.

See also