バイト列から.NETアセンブリをロード

.NETにはアセンブリ(クラスの実行部分を記述した物、いわばプログラム、多くの場合DLL形式)を実行時動的に読み込み、プログラム実行に使用する機能があります。よく使われるケースがプラグイン。プラグインファイルの中身が.NET形式のDLLになっていて、プログラム起動時に読み込み実行します。

で、今回来たミッション。

  1. サーバからオブジェクトのシリアライズされたデータが来るので、クライアントで逆シリアライズする
  2. ただしそのデータに対応するアセンブリがクライアントに組み込まれているとは限らない。無い場合はサーバにおいてあるから、適当に見つけて動的に読み込む。

プラグインファイルがサーバにあるって感じでしょうか。サーバから取ってくるアセンブリはファイルではなく、バイト配列(byte[])。中身は元々ファイルだったDLLそのままなのでローカルでそのバイト列をファイルに書き込んでから読むと言う方法もありますが、直接バイト列から読みこむSystem.Reflection.Assembly.Load(byte[])なんてのもあるのでそちらを使用。

が、アセンブリを読み込んだ後逆シリアルを行おうとすると、SerializationException。メッセージは"Unable to find assembly 'hoge'"つまり読み込んだはずのアセンブリが無かったことにされてしまっている。はて?

とりあえず見つけた解決法は以下のもの。

  1. .NET Frameworkはアセンブリが見つからないとき、AppDomain.CurrentDomain.AssemblyResolveイベントを投げるので、あらかじめハンドラをセットしておく
  2. 逆シリアライズ時にこのイベントが捕まるので、引数から必要とされるアセンブリの名前を引き出す
  3. サーバから該当するアセンブリをダウンロード
  4. ダウンロードしたデータをAssembly.Load(byte[])で読み込み、このメソッドの返り値を「イベントハンドラの返り値」にする

こうしておくとイベントハンドラから返されたアセンブリを使って逆シリアライズが進みます。

  • 試してないけどロードしたアセンブリがさらに別のアセンブリに依存していてそれが必要なら、またイベントが飛んでくるんじゃないでしょうかねぇ。(*1 追記参照)
  • 同じアプリケーションドメインである限りは、一度読み込まれたアセンブリに対してこのイベントが再び飛んでくることは無いようです。
  • イベントハンドラに返り値があるのかと奇妙に思われるかもしれませんが、あります。C#にとってイベントとデリゲートの違いって、デリゲートは=演算子が使えるくらいでしょうか?
[参考]

[ 2012/8/23 追記 ] 図らずも(*1)を別の方法で確認。自家製イベントハンドラがアセンブリを取ってくるためにサーバー通信用のアセンブリが必要なのですが、これが無い→通信アセンブリを取るためにAssemblyResolveイベント→同じハンドラで受け取りやっぱり通信アセンブリが無い、の無限再帰呼び出し orz。通信アセンブリはGACから取れるはずなのですが、もしかしてこのイベントの方が優先度上なの?

— posted by mu at 05:53 pm   commentComment [0]  pingTrackBack [0]

Entity Framework Guid型はMySQLでは?

備忘録。ADO.NET Entity FrameworkLink 上のSystem.Guid型Link をMySQLで保存するためにはchar(36)だとのこと。どおりでbinary(16)で保存しようとするとデータが長すぎますってエラーが来るわけだ。この変換はMySQL Connector .NETで行われているはず。

ちなみにVisual Studio 2010にはMS SQL Server 2008用データベース作成スクリプトを吐くという機能があるのですが、それだとそのままguid型(=uniqueidentifier?)となってました。

[ 参考 ] Entity Framework Data Type Mapping (Devart)Link

— posted by mu at 03:06 pm   commentComment [0]  pingTrackBack [0]

PSUサービス終了を発表

「早っ」というのが率直な感想。PSOBBが後継作PSULink のサービス開始後4年以上続いたのに対し、PSUは後継PSO2Link サービス開始からわずか3ヶ月で終了。よほど多くの人がPSO2に流れてしまったのか、セガとしてプレイヤーをPSO2にまとめたいのか。(PSO2は無料だろうとなんだろうと多くのユーザーを引き止めておくビジネスモデル)

かく言う私も今年になってほとんどPSUはやってなく、いつ課金を止めようかと思ってたのですが、まぁあと2ヶ月(9月分の課金は発生しない)なら、ご祝儀代わりに最後まで続けますかね。

最後のPSUは異国の地からのアクセスかもしれません (ー_ー;)

[参照] サービス終了のお知らせ (公式ページ)Link

— posted by mu at 08:20 am   commentComment [0]  pingTrackBack [0]

SQL Server 2005 Express再インストール後、User instanceが使えなくなる

これLink の絡みでいまだSQL Server 2005 Expressを使用してたりするのですが、アメリカの方からDBに変なデータが入ったのだけど消せないから見てくれと言う連絡が。たく、面倒なことを

リモートデスクトップで彼のPCに入ると、まず最初の10分でSQL Serverが2008 Expressにバージョンアップされていることが分かる。VC++ 2008も入っていたのでこの時に一緒にインストールされ、やった本人自覚なしだろう(彼これで2回目)。多分動くのだろうけど、複数バージョンサポートしたくないので2008をアンインストールして2005 Express SP4を入れなおす。MDFファイルも2008用にアップグレードされており2005じゃ読めなくなってしまったので、マスターファイルに差し替え(動作確認機なので大したデータは入ってない)。

次にsqlcmd.exeを使ってユーザーインスタンスを有効に。しかしながら、ユーザーインスタンスでMDFファイルをロードしようとすると、Failed to generate a user instance of sql server due to a failure in starting the processなるエラーが出て失敗する。Management Studio ExpressでMDFファイルをサーバーインスタンスとしてAttachすると問題なくアクセスできるため、MDFファイルにもサーバーへの接続にも問題なさそう。あくまでユーザーインスタンスだけで起きる問題。

調べた結果はC:¥Documents and Settings¥(ユーザーインスタンスを利用するユーザー名)¥Local Settings¥Application Data¥Microsoft¥Microsoft SQL Server Data¥SQLEXPRESSディレクトリを消してしまうと言うもの。どうやら以前のSQL Serverによって作られたユーザーインスタンスのごみデータが残っていたらしい。

[参考]Fix error "Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance." (ASP.NET FAQ 2009/6/18投稿分)Link

— posted by mu at 08:41 pm   commentComment [0]  pingTrackBack [0]

 

あぢぃ

blog20120719-PSO2Symbol

PSO2Link でのコミュニケーションツールの一つである、シンボルチャット。あらかじめ用意されている図形パーツを並べることによって絵を描き、会話などに使用します。

この機能自体は前身のPSOからあったのですが、内容がシンプルだったためあまり多彩な絵を描けませんでした。私も一つの絵に盛り込めるパーツの数が少なかった(=複雑な絵が描けない)ので、あまり魅力を感じず早々に見向きしなくなった次第。

PSO2のそれはパワーアップされ、使用できるパーツの数は大幅に増量、各パーツにも拡大縮小・回転・ひずみ変形がかけられるようになったため、表現力が大幅にアップ。

…しかし相変わらず操作性はほめられたものじゃないな。

  • 複数のパーツを選択できない。今回作った頭部は(こんなものでもw)20以上のパーツを使って描いてあるのですが、位置をずらしたいと思ったらそれらのパーツを一つずつ選択・移動しないといけない。
  • 小さいパーツを移動しようと思ってマウスカーソルを合わせても、先に変形・拡大縮小が有効になる。
  • 文字が英数字しかない。今回書いたひらがなは、各種図形パーツの組み合わせ。
  • 作業時と使用時の色が違う(使用時に色が濃くなる)。

画像は拙作第2弾、初夏PSO2プレイ中の状態を情景豊かに表現したもの(^_^;) なにせ暖房機動かしてプレイしていますからねぇ。

— posted by mu at 09:21 am   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.1278 sec.
prev
2025.4
next
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30