<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sofia Winters</title>
    <description>The latest articles on DEV Community by Sofia Winters (@sofiawinters).</description>
    <link>https://dev.to/sofiawinters</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F523220%2Fe791d078-7003-4589-96d4-8fa737932c93.png</url>
      <title>DEV Community: Sofia Winters</title>
      <link>https://dev.to/sofiawinters</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sofiawinters"/>
    <language>en</language>
    <item>
      <title>joyshop, a small shortcut launcher for JoyCon</title>
      <dc:creator>Sofia Winters</dc:creator>
      <pubDate>Mon, 01 Feb 2021 16:51:48 +0000</pubDate>
      <link>https://dev.to/sofiawinters/joyshop-a-small-shortcut-launcher-for-joycon-3fc2</link>
      <guid>https://dev.to/sofiawinters/joyshop-a-small-shortcut-launcher-for-joycon-3fc2</guid>
      <description>&lt;h1&gt;
  
  
  Release of joyshop
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0X_c0mba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vf0fzwe28gme02ir93d5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0X_c0mba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vf0fzwe28gme02ir93d5.gif" alt="joyshop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've just released &lt;a href="https://github.com/SofiaWinters/joyshop"&gt;SofiaWinters/joyshop&lt;/a&gt;, a small shortcut launcher for JoyCon on Windows 10. With this app, I use JoyCon as a left-handed shortcut launcher for PhotoShop.&lt;/p&gt;

&lt;p&gt;This is my first Rust project, and I met some obstacles and great crates.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lack of GUI libraries
&lt;/h1&gt;

&lt;p&gt;For Rust, some GUI libraries work on Windows, including Iced, Azul, native-windows-gui, and Conrod. They have a lot of functionality and flexibility. However, I'd like to make a transparent layered window as a tooltip, so I decided to call Win32API directly.&lt;/p&gt;

&lt;p&gt;Thanks to the winapi crate, writing GUI code in Rust is very similar to C. (My code to create window is &lt;a href="https://github.com/SofiaWinters/joyshop/blob/main/src/window.rs"&gt;joyshop/window.rs&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This is just a tip; I needed to put &lt;code&gt;#![windows_subsystem = "windows"]&lt;/code&gt; in &lt;code&gt;main.rs&lt;/code&gt; to hide a command prompt window.&lt;/p&gt;

&lt;p&gt;Building GUI with Win32API is unfamiliar to me. Everything was tough but worked. Next, I want to find a way to use a resource file to build GUI.&lt;/p&gt;

&lt;h1&gt;
  
  
  Issue of mpsc::channel
&lt;/h1&gt;

&lt;p&gt;I got panic when I call mpsc::channel's recv method. It should relate to &lt;a href="https://github.com/rust-lang/rust/issues/39364"&gt;Panic in Receiver::recv() · Issue #39364 · rust-lang/rust&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I just switched to the &lt;a href="https://github.com/crossbeam-rs/crossbeam"&gt;crossbeam-rs/crossbeam&lt;/a&gt; because I couldn't find a solution or workaround.&lt;/p&gt;

&lt;h1&gt;
  
  
  Great &lt;a href="https://github.com/KaiseiYokoyama/joycon-rs"&gt;KaiseiYokoyama/joycon-rs&lt;/a&gt; crate
&lt;/h1&gt;

&lt;p&gt;joycon-rs is a crate that can get inputs from JoyCon and control lights and vibration.&lt;/p&gt;

&lt;p&gt;I've tried to make the same application before with C#, but there are no stable libraries that meet my requirements. On the other hand, Rust has joycon-rs, which is stable and easy to use.&lt;/p&gt;

&lt;p&gt;There is one pitfall to use. The example doesn't work correctly especially using multiple controllers.&lt;/p&gt;

&lt;p&gt;All the examples have codes like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;new_devices&lt;/span&gt;
    &lt;span class="nf"&gt;.into_iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.flat_map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nn"&gt;SimpleJoyConDriver&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;.for_each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks like it works for multiple controllers, but doesn't. Because &lt;code&gt;flat_map&lt;/code&gt; discards drivers that failed to be initialized. And often contiguous initialization for multiple controllers fails.&lt;/p&gt;

&lt;p&gt;Thus, we have to handle the initialization error like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;new_devices&lt;/span&gt;
    &lt;span class="nf"&gt;.into_iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.for_each&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_driver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;create_driver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;JoyConDevice&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SimpleJoyConDriver&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="nn"&gt;SimpleJoyConDriver&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"JoyCon init error (will retry):{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_millis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>rust</category>
    </item>
    <item>
      <title>Small examples to use Rust from C#</title>
      <dc:creator>Sofia Winters</dc:creator>
      <pubDate>Sun, 06 Dec 2020 07:40:35 +0000</pubDate>
      <link>https://dev.to/sofiawinters/small-examples-to-use-rust-from-c-36d5</link>
      <guid>https://dev.to/sofiawinters/small-examples-to-use-rust-from-c-36d5</guid>
      <description>&lt;p&gt;When I make games with Unity, sometimes I need to write a native plugin. C is the most used language for native plugins, but it's not safe. So recently I use Rust. (Though Rust's safety is limited because native plugins use foreign function calls, I believe Rust is safer than C.)&lt;/p&gt;

&lt;p&gt;Then, I made small examples that use Rust from C#, including basic function calls, passing/receiving string, callback, passing/receiving struct, and handle Rust's object through a pointer.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/SofiaWinters/CSharpWithRust"&gt;SofiaWinters/CSharpWithRust&lt;/a&gt;&lt;br&gt;
Rust: &lt;a href="https://github.com/SofiaWinters/CSharpWithRust/blob/main/csharp-with-rust/src/lib.rs"&gt;csharp-with-rust/src/lib.rs&lt;/a&gt;&lt;br&gt;
C#: &lt;a href="https://github.com/SofiaWinters/CSharpWithRust/blob/main/CSharpWithRust/CSharpWithRust/RustTest.cs"&gt;CSharpWithRust/CSharpWithRust/RustTest.cs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can build a DLL file by executing &lt;code&gt;/csharp-with-rust/build.bat&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Currently, the repo only has a .Net Core project, I'll add a Unity project.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Does Rust's no_mangle function conflict with OS APIs?</title>
      <dc:creator>Sofia Winters</dc:creator>
      <pubDate>Thu, 03 Dec 2020 11:57:34 +0000</pubDate>
      <link>https://dev.to/sofiawinters/does-rust-s-nomangle-function-conflict-with-os-apis-2210</link>
      <guid>https://dev.to/sofiawinters/does-rust-s-nomangle-function-conflict-with-os-apis-2210</guid>
      <description>&lt;p&gt;I faced an odd behavior today. I wrote a Rust function and a test like below and ran them on Windows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c"&gt;// the crate socket2 is needed&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;socket2&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;net&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;IpAddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Ipv4Addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SocketAddr&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[no_mangle]&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ipv4&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nn"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dgram&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;SocketAddr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;IpAddr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Ipv4Addr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LOCALHOST&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;SocketAddr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;IpAddr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Ipv4Addr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LOCALHOST&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5678&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nd"&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[test]&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_works&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nn"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result was like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;thread 'tests::it_works' has overflowed its stack
error: test failed, to rerun pass '-p function --bin function'

Caused by:
  process didn't exit successfully: `ab583070df1ffc3d.exe tests::it_works --exact -Z unstable-options --format=json --show-output` (exit code: 0xc00000fd, STATUS_STACK_OVERFLOW)

Process finished with exit code -1073741571 (0xC00000FD)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why did the stack overflow!? I couldn't understand what happened but found 2 solutions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change the name of the function from &lt;code&gt;send&lt;/code&gt; to the others like &lt;code&gt;send2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Remove &lt;code&gt;#[no_mangle]&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, I noticed the name of the function conflicted with OS's &lt;code&gt;send&lt;/code&gt; because the name wasn't mangled. In other codes, I've also seen access violation, heap corruption errors, so this will cause undefined behavior.&lt;/p&gt;

&lt;p&gt;Then, I've made the smallest reproduction code!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"system"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;ntohl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;netlong&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[no_mangle]&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;ntohl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;unsafe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nn"&gt;api&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ntohl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;ntohl&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm not bright about C or system calls, so this will make sense for those who understand them. However, I wonder if the rust compiler can detect this conflict because this is extremely unsafe.&lt;/p&gt;

</description>
      <category>rust</category>
    </item>
    <item>
      <title>Use CGO in Windows 64bit</title>
      <dc:creator>Sofia Winters</dc:creator>
      <pubDate>Tue, 01 Dec 2020 15:24:46 +0000</pubDate>
      <link>https://dev.to/sofiawinters/use-cgo-in-windows-64bit-3374</link>
      <guid>https://dev.to/sofiawinters/use-cgo-in-windows-64bit-3374</guid>
      <description>&lt;p&gt;To use CGO in Windows 64bit, you have to install &lt;code&gt;gcc&lt;/code&gt;. The easiest way to get &lt;code&gt;gcc&lt;/code&gt; which is eligible for CGO is to install MinGW-w64.&lt;/p&gt;

&lt;p&gt;The official documentation also refers mingw-w64 as a gcc compiler for CGO.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;br&gt;
In order to use cgo on Windows, you'll also need to first install a gcc compiler (for instance, mingw-w64) and have gcc.exe (etc.) in your PATH environment variable before compiling with cgo will work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/wiki/cgo#windows"&gt;The CGO page of the go official wiki&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Download MINGW-W64
&lt;/h1&gt;

&lt;p&gt;Download a MinGW-W64 installer from &lt;a href="http://mingw-w64.org/doku.php/download/mingw-builds"&gt;MinGW-W64-builds&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Install MINGW-W64
&lt;/h1&gt;

&lt;p&gt;Execute the downloaded installer, then change &lt;code&gt;Architecture&lt;/code&gt; to &lt;code&gt;x86_64&lt;/code&gt; and &lt;code&gt;Threads&lt;/code&gt; to &lt;code&gt;win32&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3FNek_qU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lyvg2r7gbptafhuklox5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3FNek_qU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lyvg2r7gbptafhuklox5.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Add path to &lt;code&gt;mingw64/bin&lt;/code&gt; to PATH
&lt;/h1&gt;

&lt;p&gt;Add the path to &lt;code&gt;mingw64/bin&lt;/code&gt; to your system PATH environment variable. The path may look like &lt;code&gt;C:\Program Files\mingw-w64\x86_64******\mingw64\bin&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  There you go!
&lt;/h1&gt;

&lt;p&gt;This is a tiny go library source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// main.go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;

&lt;span class="c"&gt;// no space before export!&lt;/span&gt;
&lt;span class="c"&gt;//export hello&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// you have to define the main function&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;go&lt;/span&gt; &lt;span class="kd"&gt;build&lt;/span&gt; &lt;span class="na"&gt;-buildmode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kd"&gt;c&lt;/span&gt;&lt;span class="na"&gt;-shared -o &lt;/span&gt;&lt;span class="kd"&gt;hello&lt;/span&gt;.dll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To export a header file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;go&lt;/span&gt; &lt;span class="kd"&gt;tool&lt;/span&gt; &lt;span class="kd"&gt;cgo&lt;/span&gt; &lt;span class="kd"&gt;main&lt;/span&gt;.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It generates c source and header files into the &lt;code&gt;_obj&lt;/code&gt; directory. &lt;/p&gt;

&lt;p&gt;If you use Visual Studio, you can inspect the dll by &lt;code&gt;dumpbin.exe&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;dumpbin&lt;/span&gt; &lt;span class="na"&gt;/exports &lt;/span&gt;&lt;span class="kd"&gt;hello&lt;/span&gt;.dll &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;grep&lt;/span&gt; &lt;span class="kd"&gt;hello&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It'll be like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;dumpbin&lt;/span&gt;&lt;span class="err"&gt;.exe&lt;/span&gt; &lt;span class="na"&gt;/exports &lt;/span&gt;&lt;span class="kd"&gt;hello&lt;/span&gt;.dll &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;grep&lt;/span&gt; &lt;span class="kd"&gt;hello&lt;/span&gt;
&lt;span class="kd"&gt;Dump&lt;/span&gt; &lt;span class="kd"&gt;of&lt;/span&gt; &lt;span class="kd"&gt;file&lt;/span&gt; &lt;span class="kd"&gt;hello&lt;/span&gt;.dll
  &lt;span class="kd"&gt;Section&lt;/span&gt; &lt;span class="kd"&gt;contains&lt;/span&gt; &lt;span class="kd"&gt;the&lt;/span&gt; &lt;span class="kd"&gt;following&lt;/span&gt; &lt;span class="kd"&gt;exports&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="kd"&gt;hello&lt;/span&gt;.dll
         &lt;span class="m"&gt;15&lt;/span&gt;    &lt;span class="kd"&gt;E&lt;/span&gt; &lt;span class="m"&gt;000&lt;/span&gt;&lt;span class="kd"&gt;A7760&lt;/span&gt; _cgoexp_7cdc2f248ed0_hello
         &lt;span class="m"&gt;96&lt;/span&gt;   &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="kd"&gt;F&lt;/span&gt; &lt;span class="m"&gt;000&lt;/span&gt;&lt;span class="kd"&gt;A77C0&lt;/span&gt; &lt;span class="kd"&gt;hello&lt;/span&gt;
        &lt;span class="m"&gt;302&lt;/span&gt;  &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="kd"&gt;D&lt;/span&gt; &lt;span class="m"&gt;000&lt;/span&gt;&lt;span class="kd"&gt;A76C0&lt;/span&gt; &lt;span class="kd"&gt;main&lt;/span&gt;._cgoexpwrap_7cdc2f248ed0_hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can call the function from C#:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.InteropServices&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Main&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;DllImport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.dll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EntryPoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// =&amp;gt; Hello!&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
