質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

【C#】複数のソースファイルをコマンドプロンプト上でビルドする方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,861

aeuio

score 13

前提

C#の学習を始めたばかりの初心者です。
低スペックなPCしか持っておらず動作が重い上CPUの負荷を考えてIDEを使っていません。
現在、開発者用コマンドプロンプト(以下cmdと記載します)上で、csc.exeを用いてコンパイルを行っています。
そこで、複数のソースファイル(以下、ソースと記載します)があるとき、cmdでコンパイルする方法はありますでしょうか。

実現したいこと

・やりたい事はクラスが書かれたソースと、エントリーポイントが書かれたソースが
個別であってもcmd上でビルドを完結させる事です。
(CやC++における、「 cl /c 」で.objファイルを作成 → 
「 link 」 を使って実行ファイルを作成、のような方法があるのかどうかです。)
・同一ソースに書けばビルド自体はできる事は承知の上で、個別にソースがある状態での方法の有無を知りたいです。

調べたこと・試したこと

■クラスが書かれたソースを.dllにしてそれをDllImportを用いて読み込もうとしました。

・ファイル名
エントリーポイントのあるソース : a.cs
クラスを定義したソース            : b.cs

・b.dllを生成
csc.exe -target:library b.cs

・a.csに下記コードを追記

using System.Runtime.InteropServices;
public partial class DllImport : System.Windows.Forms.Form
{
    [DllImport("b.dll"]
    public static extern int add(int a, int b);//b.cs内で定義した関数名
}

発生したエラー

a.cs(b.dll定義のクラスの変数を宣言した行): error CS0246: 
型または名前空間名 'Calc' が見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足しています。


'Calc'はb.csで定義したクラスの名前です。
そもそもdllImportではWind32APIやC等で作成関数を呼びだす事は出来ても、
クラスは呼びだせないし、その為クラスのメンバ関数も呼び出せないという事でしょうか。
だとしたらやりたい事と方法が全くちぐはぐですね、すみません。
何か、C#の言語特性を全く理解してないようなちぐはぐな発想だったり、
既出だとか情報不足、或いは調査不足でしたらすみません。
VSを使えと言われたら最もなのですが、何卒よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+7

kazto さんのおっしゃる通りですが、それでも言います。
IDE を使ってください。
そこまで重くありません。

たとえ起動に 1 分待ったとしても、VSCode で初心者が四苦八苦するくらいなら、十分元は取れて数時間から数万時間は得をします。
私は五年前のノートパソコンに仮想環境を作ってそこに Visual Studio をインストールして使ったことがありますが、十分実用的でした。

初心者がテキストエディタを使って C# の開発をすることには害しかありません。
IDE を使いこなせなければ、学習に数年から数十年は後れをとります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 12:46

    ご回答ありがとうございます。
    今回回答を頂いた方法は一先ず試してみますが、害しかないとまで言われますと、
    今後はおとなしくIDEを使うようにします、すみませんでした。

    キャンセル

  • 2019/03/12 13:09

    謝ることはないと思いますが、IDE を使っていれば引っかかることすらなかった今回の問題にどのくらい時間を有したかを計れば、IDE の起動時間とどちらが無駄だったかわかると思います。

    C# は Visual Studio を前提として開発されており、情報の多さも新機能への対応も開発効率もこれを使うのと使わないのでは全く違います。

    テキストエディタでの開発は「わかってる人が IDE と併用して行うもの」で、初心者がこれを単独で使うのは、柔道初心者が受け身を練習せず自分独自の必殺技を考えるようなものです。

    守破離という言葉がありますが、守もおぼつかないのに最初から離を目指していては大きく遅れることになるでしょう。

    キャンセル

  • 2019/03/12 13:19

    仰る通りですね…。
    ちょっと意固地みたいになってた所があります。
    学習姿勢から見直していきたいと思います。
    ありがとうございました。

    キャンセル

  • 2019/11/24 13:01

    お疲れ様です。私もだいぶ悩まされました。
    例えばcs.batとしてバッチファイルを作って以下を記述し、
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe %1
    コマンドプロンプトでcs *.csとして実行すればコンパイルできました。
    *マークで書けば分割コンパイルしてくれるのではないでしょうか。

    キャンセル

+3

MSBuildというコマンドがあります。

一度はVisualStudioを起動して、プロジェクトファイルを作成する必要はありますが。

http://sh-yoshida.hatenablog.com/entry/2017/05/27/012755

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 12:07

    お早い返信大変ありがとうございます、一度試してみます。

    キャンセル

+1

DllImportはWindowsAPIなどのDLL関数を呼び出すための属性なので、C#で作ったdllを参照したい場合は「参照設定を入れて」ビルドする必要があります。

恐らく、次のような書き方になると思います。
(aとbが同じフォルダにある場合)

csc.exe /reference:b.dll /target:winexe a.cs

また、aからbのクラスを利用したい場合は、冒頭に「using bに定義されている名前空間;」と書くか「bに定義されている名前空間.bに定義されているクラス」と書く必要があります。

参考
csc.exeだけで参照設定しながらコンパイルする方法

余談

あくまで言語学習が目的なら、クラウドIDEでも良いのではないでしょうか。
例えばpaiza.ioなどです。

こちらなら、PCのスペックはあまり必要なく(ブラウザが開ける程度なら問題ない)、ネットさえ繋がっていればビルドなどはあまり意識せず利用できます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 13:06

    ご回答ありがとうございます。
    試してみたところ、
    「error CS0122: 'Calc' はアクセスできない保護レベルになっています」
    というエラーになりましたが、ちょっと色々記法に間違いがないか含めて
    弄ってみたいと思います。

    また、Zuishin様の仰るように、言語学習の外の環境設定(?)のような部分で
    時間を使いすぎるのも確かに無駄なので、これからはクラウドIDEも含め、
    IDEを利用したいと思います。
    重ね重ね、ありがとうございました!

    キャンセル

  • 2019/03/12 13:35

    そのほうが良いと思います。

    ちなみにですが、そのエラーは察するに、恐らく参照設定はできています。
    CS0122のエラーは、アクセス保護レベルが違うという一種の構文エラーなので、おそらくCalcというメンバーの手前にpublicキーワードをつければ動くと思います。

    キャンセル

  • 2019/03/12 13:43

    ありがとうございます!できました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る