<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>.Net - Tag - Ateon</title><link>https://ateon.ch/tags/.net/</link><description>.Net - Tag - Ateon</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 05 Jun 2025 21:24:00 +0200</lastBuildDate><atom:link href="https://ateon.ch/tags/.net/" rel="self" type="application/rss+xml"/><item><title>Bundling a Game Made with MonoGame</title><link>https://ateon.ch/posts/monogame_bundle/</link><pubDate>Thu, 05 Jun 2025 21:24:00 +0200</pubDate><author>Luca Schafroth</author><guid>https://ateon.ch/posts/monogame_bundle/</guid><description><![CDATA[<p>While developing <strong>Vulcard</strong> for this year&rsquo;s iteration of the <a href="https://gtc.inf.ethz.ch/education/game-programming-laboratory/previous-years/2025.html" target="_blank" rel="noopener noreffer ">Game Programming Lab</a> at ETH Zurich, we wanted to integrate the Steam API and package the game for multiple platforms. This process came with a few unexpected hurdles.</p>
<p>In this post, I&rsquo;ll walk through the complete solution we ended up using. If you&rsquo;re looking to publish a MonoGame project on Steam, this might save you some time.</p>
<div class="details admonition tip">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>What&#39;s Monogame?<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><a href="https://monogame.net/" target="_blank" rel="noopener noreffer ">MonoGame</a>  is a cross-platform .NET framework for game development. It has for example been used to develop Stardew Valley.</div>
    </div>
</div>
<h2 id="general-setup">General Setup</h2>
<p>I assume you already have a working .NET 6+ (MonoGame) project and the corresponding SDK installed. You’ll also need a <a href="https://partner.steamgames.com/" target="_blank" rel="noopener noreffer ">Steamworks</a> developer account to access the Steamworks SDK.</p>
<p>To make platform-specific builds easier, define platform detection constants in your <code>.csproj</code> file:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-xml"><span class="code-title has-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i>
                <span class="code-filename">Vulcard.csproj</span>
            </span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;PropertyGroup&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;IsWindows</span> <span class="na">Condition=</span><span class="s">&#34;&#39;$(RuntimeIdentifier)&#39; == &#39;win-x64&#39; or (&#39;$(RuntimeIdentifier)&#39; == &#39;&#39; and $([MSBuild]::IsOSPlatform(&#39;Windows&#39;)))&#34;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/IsWindows&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;IsOSX</span> <span class="na">Condition=</span><span class="s">&#34;&#39;$(RuntimeIdentifier)&#39; == &#39;osx-x64&#39; or (&#39;$(RuntimeIdentifier)&#39; == &#39;&#39; and $([MSBuild]::IsOSPlatform(&#39;OSX&#39;)))&#34;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/IsOSX&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;IsLinux</span> <span class="na">Condition=</span><span class="s">&#34;&#39;$(RuntimeIdentifier)&#39; == &#39;linux-x64&#39; or (&#39;$(RuntimeIdentifier)&#39; == &#39;&#39; and $([MSBuild]::IsOSPlatform(&#39;Linux&#39;)))&#34;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/IsLinux&gt;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;IsWindows</span> <span class="na">Condition=</span><span class="s">&#34;&#39;$(IsWindows)&#39; == &#39;&#39;&#34;</span><span class="nt">&gt;</span>false<span class="nt">&lt;/IsWindows&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;IsOSX</span> <span class="na">Condition=</span><span class="s">&#34;&#39;$(IsOSX)&#39; == &#39;&#39;&#34;</span><span class="nt">&gt;</span>false<span class="nt">&lt;/IsOSX&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;IsLinux</span> <span class="na">Condition=</span><span class="s">&#34;&#39;$(IsLinux)&#39; == &#39;&#39;&#34;</span><span class="nt">&gt;</span>false<span class="nt">&lt;/IsLinux&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/PropertyGroup&gt;</span></span></span></code></pre></div></div><h2 id="add-steamworks-dependencies">Add Steamworks Dependencies</h2>
<p>Download the Facepunch.Steamworks library directly from the <a href="https://github.com/Facepunch/Facepunch.Steamworks/releases/" target="_blank" rel="noopener noreffer ">GitHub releases page</a> and extract the contents of the <code>net6.0</code> folder into a new folder in your project root called <code>Steamworks</code>.</p>
<p>Also, download the official Steamworks SDK directly from <a href="https://partner.steamgames.com/downloads/list" target="_blank" rel="noopener noreffer ">Steamworks</a>. As of writing, SDK version 1.61 works with the latest release of Facepunch.Steamworks. Copy the redistributable binaries (steam_api64.dll, libsteam_api.so, etc.) into the same Steamworks folder.</p>
<p>Your <code>Steamworks/</code> folder should now include:</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-txt"><span class="code-title has-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i>
                <span class="code-filename">Steamworks/</span>
            </span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Facepunch.Steamworks.Posix.deps.json
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Posix.dll
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Posix.pdb
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Posix.xml
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Win64.deps.json
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Win64.dll
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Win64.pdb
</span></span><span class="line"><span class="cl">Facepunch.Steamworks.Win64.xml
</span></span><span class="line"><span class="cl">libsteam_api.dylib
</span></span><span class="line"><span class="cl">libsteam_api.so
</span></span><span class="line"><span class="cl">steam_api64.dll</span></span></code></pre></div></div><div class="details admonition tip">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>32-bit Support<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">To support 32-bit Windows systems, you’ll need to include the appropriate 32-bit versions of the Steam libraries as well.</div>
    </div>
</div>
<p>Update the <code>.csproj</code> to reference the Facepunch.Steamworks and native libraries for the correct platform:</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-xml"><span class="code-title has-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i>
                <span class="code-filename">Vulcard.csproj</span>
            </span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;ItemGroup&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!-- Reference Facepunch.Steamworks --&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;Reference</span> <span class="na">Include=</span><span class="s">&#34;Facepunch.Steamworks, Version=2.4.1, Culture=neutral, processorArchitecture=MSIL&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;SpecificVersion&gt;</span>False<span class="nt">&lt;/SpecificVersion&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;HintPath</span> <span class="na">Condition=</span><span class="s">&#34;$(IsWindows)&#34;</span><span class="nt">&gt;</span>Steamworks/Facepunch.Steamworks.Win64.dll<span class="nt">&lt;/HintPath&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;HintPath</span> <span class="na">Condition=</span><span class="s">&#34;$(IsOSX) or $(IsLinux)&#34;</span><span class="nt">&gt;</span>Steamworks/Facepunch.Steamworks.Posix.dll<span class="nt">&lt;/HintPath&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/Reference&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!-- Include native Steamworks libaries --&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;Content</span> <span class="na">Include=</span><span class="s">&#34;Steamworks/steam_api64.dll&#34;</span> <span class="na">Condition=</span><span class="s">&#34;$(IsWindows)&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;Link&gt;</span>steam_api64.dll<span class="nt">&lt;/Link&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/Content&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;Content</span> <span class="na">Include=</span><span class="s">&#34;Steamworks/libsteam_api.dylib&#34;</span> <span class="na">Condition=</span><span class="s">&#34;$(IsOSX)&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;Link&gt;</span>Lib/libsteam_api.dylib<span class="nt">&lt;/Link&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/Content&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;Content</span> <span class="na">Include=</span><span class="s">&#34;Steamworks/libsteam_api.so&#34;</span> <span class="na">Condition=</span><span class="s">&#34;$(IsLinux)&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;Link&gt;</span>libsteam_api.so<span class="nt">&lt;/Link&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/Content&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/ItemGroup&gt;</span></span></span></code></pre></div></div><div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>libsteam_api.dylib<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>The native steam library for macOS <code>libsteam_api.dylib</code> is copied directly into the <code>Lib</code> folder to conform with the app bundle structure for macOS.</p>
<p>This might mess with your setup if you are using macOS for development. If you know of a good way to force NetBeauty to automatically copy the file to the <code>Lib</code> folder during bundling, let me know.</p>
</div>
    </div>
</div>
<p>If everything is working, you can initialize the Steam API in your code and check the connection.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-cs"><span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">void</span> <span class="n">Initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Steamworks</span><span class="p">.</span><span class="n">SteamClient</span><span class="p">.</span><span class="n">Init</span><span class="p">(</span><span class="m">480</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kt">var</span> <span class="n">playername</span> <span class="p">=</span> <span class="n">Steamworks</span><span class="p">.</span><span class="n">SteamClient</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Debug</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&#34;{0}&#34;</span><span class="p">,</span> <span class="n">e</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="details admonition warning open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>App ID<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">Replace <code>480</code> with your actual Steam App ID for a release. Facepunch.Steamworks also doesn&rsquo;t require a <code>steam_appid.txt</code> file.</div>
    </div>
</div>
<h2 id="bundling-windows--linux">Bundling Windows &amp; Linux</h2>
<p>Download <a href="https://github.com/Ellpeck/GameBundle" target="_blank" rel="noopener noreffer ">GameBundle</a>. This neat tool greatly simplifies the bundling process and provides a clean looking folder structure by using <a href="https://github.com/nulastudio/NetBeauty2" target="_blank" rel="noopener noreffer ">NetBeauty</a> internally.</p>
<p>And that is it. You can now use the Steam API and bundle your game for Windows and Linux:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash"><span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gamebundle -wl -z --mg
</span></span><span class="line"><span class="cl"><span class="c1"># -w: Build for Windows</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -l: Build for Linux</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -z: Zip output</span>
</span></span><span class="line"><span class="cl"><span class="c1"># --mg: Don&#39;t move MonoGame&#39;s native libraries to the Lib folder</span></span></span></code></pre></div></div><p>Note that Linux users will need to add the permissions to execute the game.</p>
<h2 id="bundling-macos">Bundling macOS</h2>
<p>Bundling for macOS is a bit more involved and additionally requires a property list file and a separate icon.</p>
<p>Convert your existing game icon to the <code>icns</code> format and store the new file under <code>Icon.icns</code> directly in the root. Then create a new file called <code>Info.plist</code> also in the project root.</p>
<p>Add the following content to the <code>Info.plist</code>. Replace <code>MyApp</code> with the name of your application and <code>com.example.MyApp</code> with your identifier.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-xml"><span class="code-title has-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i>
                <span class="code-filename">Info.plist</span>
            </span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE plist PUBLIC &#34;-//Apple//DTD PLIST 1.0//EN&#34; &#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&#34;&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;plist</span> <span class="na">version=</span><span class="s">&#34;1.0&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;dict&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>CFBundleIconFile<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>Icon<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>CFBundleName<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>MyApp<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>CFBundleIdentifier<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>com.example.MyApp<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>CFBundlePackageType<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>APPL<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>CFBundleVersion<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>1.0<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;key&gt;</span>CFBundleShortVersionString<span class="nt">&lt;/key&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;string&gt;</span>1.0<span class="nt">&lt;/string&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/dict&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/plist&gt;</span></span></span></code></pre></div></div><p>Finally, adjust your <code>.csproj</code> to include them during the build for macOS:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-xml"><span class="code-title has-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i>
                <span class="code-filename">Vulcard.csproj</span>
            </span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;ItemGroup</span> <span class="na">Condition=</span><span class="s">&#34;$(IsOSX)&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;Content</span> <span class="na">Include=</span><span class="s">&#34;./Info.plist&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/Content&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;Content</span> <span class="na">Include=</span><span class="s">&#34;./Icon.icns&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/Content&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/ItemGroup&gt;</span></span></span></code></pre></div></div><p>Now you can also bundle your game for macOS again using GameBundle.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash"><span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gamebundle -m -bz --mg --nbeauty2
</span></span><span class="line"><span class="cl"><span class="c1"># -m: Bundle for macOS</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -b: Output correct structure and create app bundle for macOS</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -z: Zip output</span>
</span></span><span class="line"><span class="cl"><span class="c1"># --mg: Don&#39;t move MonoGame&#39;s native libraries to the Lib folder</span>
</span></span><span class="line"><span class="cl"><span class="c1"># --nbeauty2: Use NetBeauty2 instead of NetCoreBeauty</span></span></span></code></pre></div></div><div class="details admonition info">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-info" aria-hidden="true"></i>Why --nbeauty2?<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>The .Net version I used (8.0.410) does not have a patched .Net SDK for macOS in NetCoreBeauty.</p>
<p>NetBeauty2 uses a different setup, which works in that case. However, there are other drawbacks with NetBeauty2.</p>
</div>
    </div>
</div>
<div class="details admonition warning">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-exclamation" aria-hidden="true"></i>Signing &amp; Notarization<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">The setup shown here does not include signing and notarizing the app, which is required by Apple if you want to distribute the app.</div>
    </div>
</div>
<h2 id="conclusion">Conclusion</h2>
<p>You can now use the Steamworks API in your .Net project and bundle it for Windows, Linux and macOS. Hope this saves you some time.</p>
<p>See the <a href="https://github.com/gewlar/monogame_example" target="_blank" rel="noopener noreffer ">github repository</a> for a basic setup that includes project structure, and configuration files.</p>
<div class="details admonition note">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>Note<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">By the way you can find Vulcard on <a href="https://store.steampowered.com/app/3764530/Vulcard" target="_blank" rel="noopener noreffer ">Steam</a>.</div>
    </div>
</div>]]></description></item></channel></rss>