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
これでビルドしようとすると、エラーが出る。
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;このようなコードがあった場合、.NET 1.1のcscは以下のようなエラーを返す:class Test
{
public bool Foo ()
{
return IntPtr.Zero != null;
}
}
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だった。