コンテンツへスキップ
ものがたり
戻る

yaneSDKをgmcsでビルドしてみる

id:yaneurao:20060308:p1 のyaneuraoGameSDK.NETは、akirameiさんはさり気なくmono上で動かしているけど、実はgmcsではビルドできなかったりする(w

まず、prj2makeはたぶんVS2005形式のcsprojに対応していないので、prj2makeは使えない。

ls */*.cs */*/*.cs | grep -v sample > YaneSDK.dll.sources   

gmcs -t:library -out:Yanesdl.dll -unsafe @Yanesdk.dll.sources -pkg:dotnet

で、ビルドする。

追記2: -d:LINUXと-d:linuxがいる

これでビルドしようとすると、エラーが出る。

src/system/direnumerator.cs(91,12): error CS1631: Cannot yield a value in the body of a catch clause

EMCA 334のセクション15.14の定義は

It is a compile-time error for a yield return statement to appear anywhere in a try statement that contains catch-clauses.

となっているのだけど、gmcsはyield breakまでエラーにしてしまう。というわけで、このバグレポートのパッチを適用するこのパッチはマージされた。

すると次はコレだ。

src/draw/Win32Window.cs(361,8): error CS0019: Operator !=' cannot be applied to operands of type Yanesdk.Draw.Win32Window.hRC’ and `null’

実はコレは.NET 2.0のcscのバグに依存しているyaneSDKの問題だ。

using System;

class Test
{
public bool Foo ()
{
return IntPtr.Zero != null;
}
}このようなコードがあった場合、.NET 1.1のcscは以下のようなエラーを返す:

intptr.cs(7,10): error CS0019: Operator ’!=’ cannot be applied to operands of type ‘System.IntPtr’ and ”

ECMA 334のセクション14.9を読む限り、これが正しい動作だ。.NET 2.0のcscはCS0019を正しく報告しない。

Microsoftがこのバグに適切に対処するかどうか、その対応は興味深い。

さて、このエラーはyanesdkのソースを変更してIntPtrとnullを比較している部分のnullをIntPtr.Zeroに置き換えればいなくなる。コレはとても簡単なので直して下さい>やねセンセイ

さてさて、これを直してもさらに問題が発生する:

src/input/virtualkey.cs(108,28): error CS0051: Inconsistent accessibility: parameter type Yanesdk.Input.VirtualKey.KeyInfo' is less accessible than method Yanesdk.Input.VirtualKey.<#AnonymousMethod>9(Yanesdk.Input.VirtualKey.KeyInfo)’

これはgmcsのanonymous methodの実装の問題だ。と思う。あまりにもそれっぽく見えるので仕様はチェックしていないんだけど、まあそうだろう。

アクセシビリティチェックまわりの問題はどうせ簡単には直せないだろうから、ここは他のmcs hackersに任せておく。幸い、KeyInfoクラスをprotectedからpublicに置き換えてビルドできるようになった。

追記: 既知のバグだったみたい。まともなrepro codeを追加したので、対処してもらえるかもしれない。

追記5: 見直してみたら2行の修正で直ってしまった。たぶんそのうちパッチが適用されることになると思う。

追記3: 実行するとこんなのが…

Unhandled Exception: System.InvalidProgramException: Invalid IL code in Enumerator:.ctor (System.Collections.Generic.List`1): IL_0011: ldfld 0x0a0000dd

svn上ではPEのverifierコードでいろいろ手が加えられているから、それが原因かなあ。ちょっと掘り下げてみる必要がありそうだとても最近のregressionだった


コメント

yaneurao — 03/13/2006 04:37:09

ありがとうございます(´ー`) 修正しておきますネ!

atsushieno — 03/13/2006 04:59:14

あ、ありがとうございます(__
KeyInfoの方はgmcs側で直すべきものだと思っています(念のため…)。mcs/gmcsハカー連中は100件近いバグ対応で忙しそうなので、自分で直せないかどうか、もう少しgmcsのソースを眺めてみます。

akiramei — 03/13/2006 11:12:02

実はgmcsではビルドできなかったりする
あっ、そーだったんですか。(^^;
makeファイル書くの面倒だったので、試さなかったんですよね・・・

atsushieno — 03/13/2006 13:53:16

逆に僕はデバッグの事を考えて、大抵は自前でビルドできるかどうか試してみるんですよ。んでたまに結局動かせなかったりとか…(^^;


この記事を共有:

前の記事
次の記事
プロトコルを開示せよと言われたので、ソースを出したら、氏ねと言われた