« ◆蘇るマックスウェルの悪魔 | トップページ | ◇形容詞と形容動詞は逆である »

メモ:C#コンパイラをANTで動かす

個人的メモです。備忘録です。普通は備忘録を書いた段階で 忘れなくなってしまうものですが、 マイクロソフトの製品だけは例外で、何度やっても直ぐ忘れます。

#### bat,nmake使用の場合
---- nmake起動バッチファイル ----
@echo off
set path=%path%;C:\Program Files\Microsoft Visual Studio 9.0\VC\bin^
;C:\WINDOWS\Microsoft.NET\Framework\v3.5
nmake
pause
---- nmake用Makefile ----
Program.exe:Program.cs
        csc /lib:D:\TstDir\ClassLibrary1\ClassLibrary1\bin\Release \
            /reference:ClassLibrary1.dll \
            Program.cs
#### ANT使用の場合
---- ANT ----
<project default="main">
   <property name="CSC"
             value="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc"/>
   <property name="lib-dir"
             value="D:\TstDir\ClassLibrary1\ClassLibrary1\bin\Release"/>
   <property name="dll"
             value="ClassLibrary1.dll"/>
   <property name="prgs"
             value="Program.cs"/>
   <target name="main">
      <copy file="${lib-dir}/${dll}" todir="."/> <!-- 注意 -->
      <exec executable="${CSC}"> <!-- execタスクでコンパイラを起動 -->
         <arg line="/reference:${dll} ${prgs}"/>
      </exec>
   </target>
</project>

 C#コンパイラをコマンドラインから動かす。

C#コンパイラを自作ライブラリdllを参照する形で動かします。

コンパイラは csc です。
ビルドツールとして nmake を使用します。

開発には通常VisualStudioを使いますが、コンパイラcscは cscは.NetFrameworkに用意されるようです。
ここではバッチファイルでパス設定しています。

C:\WINDOWS\Microsoft.NET\Framework\v3.5
実装環境に依存します。

ビルドツールとしてnmakeがVisualStudioに用意されています。その パスをセットしまています。 ツールとしてはVCのbinに置かれていますがC#でも当然使えます。

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin
実装環境に依存します。

 長い行の分割:重要です

バッチファイルは行の最後に ^ (チルダ)を付ければ 次の行とつながっていることになります。

Makefileは行の最後に \ (逆スラッシュ 、あるいは円マーク)を付けると次の行につながっている ことになります。
逆スラッシュはWindowsではファイルの区切りと衝突しますが、 行の最後のものは別解釈で行連結となります。ファイルの区切り とはならないことに充分注意が必要です。 Windowsは注意に注意を 重ねても不出来な仕様に不出来な仕様が重なっているので なかなか動きません。注意に注意を重ねさらに注意を重ねる 必要があります。

Unixのmakeに比べnmakeはただ一つ利点があります。それはコマンド 行の頭にタブを置く必要がないことです。

 意味不明のエラー:CS2008

コマンド形式に不備があると次の様なエラーが出ます。 例えばここの例では行の最後の\がぬかるなど

fatal error CS2008: 入力が指定されていません。
NMAKE : fatal error U1077: 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.EXE' :
リターン コード '0x1'

基本的にマイクロソフトの製品の出すメッセージは全く意味の 分からないものだらけですが、このメッセージは、大概の場合 コマンドの主対象(ここではProgram.cs)が与えられなかった 場合にでます。もちろんマイクロソフト 製品ですのでその基本は常にデタラメです。

 コンパイル時の参照dll指定

自作dllなどを参照する場合、コマンドオプション/referenceで .dllを指定します。

  • /reference:参照する.dllファイル
フルパスを/referenceで指定しても構いませんが、検索ディレクトリ を/libオプションで指定する事も出来ます。
ここの例ではディレクトリ名(/lib指定)とファイル名(/reference) に分けています。
/lib:D:\TstDir\ClassLibrary1\ClassLibrary1\bin\Release ディレクトリ
/reference:ClassLibrary1.dll                           ファイル

しかし
残念ながら/libで指定したディレクトリにあるdllは実行時にリンク されません。PATHに設定するとできるはずなのですが、出来ません。 マイクロソフトの製品は常に「はずだ」通りには動かなように なっています。exeと同じフォルダにdllを置くと動きます。 したがって、/lib指定は現時点では行うべきではないと 考えています。(もちろん、そんな訳はないので、解決法を探さなければ なりません)

 補足:ここの例でのファイル名、ディレクトリ名

ライブラリはVisualStudioを使って作成しました。
"ClassLibray1"というのはそのデフォルト名です。
もちろん、通常は意味のある名前にします。

アプリケーションプログラムも当初VisualStudioで 作成したものを、移動したものです。
Program.csというのはそのデフォルト名です。
もちろん通常は意味のある名前にします。

 ANTで実行

ANTでC#コンパイラを実行させることもできます。build.xmlは 次のような形となります。

<project default="main">
   <property name="CSC"
             value="C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc"/>
   <property name="lib-dir"
             value="D:\TstDir\ClassLibrary1\ClassLibrary1\bin\Release"/>
   <property name="dlls"
             value="ClassLibrary1.dll"/>
   <property name="prgs"
             value="Program.cs"/>
   <target name="main">
      <exec executable="${CSC}"> <!-- execタスクでコンパイラを起動 -->
         <arg line="/lib:${lib-dir} /reference:${dlls} ${prgs}"/>
      </exec>
   </target>
</project>

この例では/libを指定していますが、冒頭の例のようにexeを置くディレクトリ にコピーする形が確実です。

|

« ◆蘇るマックスウェルの悪魔 | トップページ | ◇形容詞と形容動詞は逆である »

トラックバック


この記事へのトラックバック一覧です: メモ:C#コンパイラをANTで動かす:

« ◆蘇るマックスウェルの悪魔 | トップページ | ◇形容詞と形容動詞は逆である »