ものがたり(旧)

atsushieno.hatenablog.com に続く

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だった