1
2

VisualStudioでRustを便利に相互運用する

Last updated at Posted at 2023-11-21

Visual Studio大好き(codeじゃないほう)

今回はVisualStudio(2022)でRustを快適(?)に運用する方法を共有したいと思います。

完成形

ディレクトリ構造

image.png

動作

プロジェクトのビルドが完了すると、Rustのコンパイルが始まり、生成結果フォルダに (プロジェクト名).rs.dll という名のバイナリがコピーされる。

長所

  • ケース規則が揃う(プロジェクト直下はパスカルケース、フォルダー内はスネークケース)
  • Rustとその他(今回はC#)をまとめてコンパイル結果に入れられる。

手順

image.png

0. Pythonの準備

インストールできてなかったらして下さい。

1. プロジェクトの作成

普通にプロジェクトを作る。
今回はC#(csproj)でやった。他のプロジェクトでもできると思うけど保証しない。

2. Cargo.toml の作成

公式ドキュメントに従って、好きに書いて下さい。
この時、プロジェクト名はスネークケースにしましょう。

3. Rustプロジェクトの準備

プロジェクトフォルダ内に src フォルダ、その下に lib.rs などを置く。

4. PostBuild.py の作成

プロジェクトフォルダー直下に PostBuild.py を作る。
中身はこんな感じにする。

import sys
import os
import shutil
import subprocess

def snake_to_pascal(s):
    return '.'.join(word.capitalize() for word in s.split('_'))

config = sys.argv[1]
dest = sys.argv[2]

if config == "Debug":
    subprocess.run(["cargo", "build", "--lib"])
    source = os.path.join("target", "debug")
elif config == "Release":
    subprocess.run(["cargo", "build", "--lib", "--release"])
    source = os.path.join("target", "release")
else:
    raise ValueError

for file_src in os.listdir(source):
    if file_src.endswith(".dll"):
        file_dst = snake_to_pascal(os.path.splitext(file_src)[0]) + ".rs.dll"
        shutil.copy2(os.path.join(source, file_src), os.path.join(dest, file_dst))
    elif file_src.endswith(".pdb"):
        file_dst = snake_to_pascal(os.path.splitext(file_src)[0]) + ".rs.pdb"
        shutil.copy2(os.path.join(source, file_src), os.path.join(dest, file_dst))

5. プロジェクトの編集

以下の要素をProject要素直下に置く。

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="py PostBuild.py $(ConfigurationName) $(TargetDir)" />
  </Target>

6. gitignore(必要であれば)

targetディレクトリを除外するため、以下の文を .gitignore に追加する。

# Cargo build target
target/

おわりに

なにか改善案あればお聞かせ下さい。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2