PowerShell automationでスクリプト関数を使う

これLink の続き。ようやくVB.NET/C#.NETからPowerShellのスクリプト関数を定義して実行する目処がつきました。

内容は長いのでこちらにLink

— posted by mu at 10:04 pm   commentComment [0]  pingTrackBack [0]

 

PSU大規模仕様変更でトラブル

blog20070918PSUBootCamp

PSULink で続編イルミナスの野望Link に向けた比較的大きな変更が昨日行われました。拾い物の武器にも属性がついていたり、SUV/ナノブラストといった特殊技能を行使してもそれ以前に付加した能力増強効果が維持されるなどいろいろありますが、最も影響の大きいのはダメージ計算方法の変更。こちらが与えるダメージが増えて喜んでいたら、もらうダメージも増えていて今まで耐えられた攻撃に対しても戦闘不能が続出。う〜ん、防御方法を見直さないといけないか?

セガには悪いけど過去の経験から思うに、これだけ変更してLink トラブルが発生しないほうが稀。そもそもこの変更一回実施を延期Link してます。セガに限らず更なる安定性の確保のためと説明されるのが延期発表時の常ですが、とても提供できる状態じゃないというのがありがちな実態。イルミナスの野望発売前にはやらなければいけないという期限付きのこの変更、万全の状態にして提供なんて余裕があるわけなく、やっぱりトラブルが起きてしまいましたLink (つд`)。

そのひとつがマイルームに戻れないというもの。私が戻ろうとした直前に発生したらしく、見事足止めを喰らう。そんなに早く直るものじゃないだろと思いつつも小一時間ほどクエストしましたが、やっぱり直らず。その間にマイルームに戻る端末前に人だかりできてるしw

で、みんな帰宅待ちなのですかという発言を発端に、帰宅難民→ここは難民キャンプ→踊って回復を祈れ→踊って痩せろ→グラール難民ブートキャンプと訳の分からない会話に発展したのは面白かったw 写真はその難民ブートキャンプ。

発表では今朝回復したようですが、イルミナスの野望発売と前後して大きな変更が予定されており、まだトラブルは続きそうな予感はします。それをいまや恒例と寛容になるどころか期待している私って、PSUの世界に変な適応してしまったなぁ。

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

PSU 1周年サンクスフェスタ継続中

経験値と報酬垂れ流しのサンクスフェスタ継続中。どれくらい垂れ流しかというと、9/6から始まり昨日までの11日間で
キャラクター レベル 持ち金
1st 87→98 150万→320万
2nd 47→90 10万→160万
ちなみに現時点のレベル上限100、この一年での総獲得金額は1000万行っていないはず。PSOのレアアイテムドロップ率アップの時ほど気合入れず、小走り程度でやっててこれ。毎日これにかかりっきりでやれば、最初の30日無料期間中にLv1から100にできるというのも頷ける。こんなイベントが3週間。PSOLink ならこんな状態1週間以上は続けないだろうな。
blog20070917PSUTankKill

今は2ndキャラにキラーシュート(ライフルの付加機能で低確率で敵を一撃で倒す)を持たせ、ロボット軍団撃破の繰り返し。キラーシュートがPP(エネルギーみたいなもの?)消費が激しいので5丁のライフルを次々交換しながらと、なんか映画である銃を撃っては換え撃っては換えみたいで面白かったり。敵の体力が高く、数が尋常じゃないのでキラーシュートがかなり有効、経験値がじゃんじゃん入ってきます。

blog20070917PSUKimeraLappy

下の写真はロビーで見かけたキメララッピーw この写真にいるのは私じゃありませんが、私もラッピー着ぐるみ愛用者の一人。これのいいところは、縫い目・顔出し穴・生地・ピヨピヨ足音などの「着ぐるみらしさ」が高いこと。PSOのラッピー博士が本物のラッピーらしさを追求(てか、見分けつかんw)しているのに対し、こちらはあくまで「着ぐるみらしさ」。ファスナーもあると更に良かったのですがw

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

.NETから可変引数のCOMメソッドを呼ぶ

先日Link の続き。未だSystem.Management.Automation.RunspaceにPowerShellスクリプト関数を定義して実行する方法がわからないので(2009/4/3 分かりましたLink )、COM実装のMSScriptControl.ScriptControl使用に方針変更。

VB6ならば以下のようにすれば使えます。
  1. Microsoft Script Control 1.0を参照設定
  2. MSScriptControl.ScriptControlクラスのインスタンスを作成
  3. Languageプロパティに言語を指定(今回は"VBScript")
  4. AddCodeメソッドで関数を定義する
  5. Runメソッドで定義した関数を呼ぶ

.NET上で作成したCOMインスタンスは開放処理しないとメモリに残り続けるLink という手間はあるようですが、.NET上でもCOMは.NET Frameworkとほぼ等価に扱えるため、同じ手法で実行できるはず。

が、トラブる。Runメソッドを呼ぶ段階になると

System.ArgumentException: HRESULT からの例外: 0x800A01C2 場所 MSScriptControl.ScriptControlClass.Run(String ProcedureName, Object[]& Parameters)

なる例外を出してしまいます。原因はRunメソッドが第2引数以降を可変長引数(VBでいうParamArray)を取るため。これの扱いは
環境 可変長引数の渡し方
Visual Studio 6/COM Variant配列への参照 Object[]&
Visual Stduio .NET/.NET Framework Object配列の実値 Object[]
と型が違います。Object[]の後の&の有無の違い。この一文字の有無で動作しないのだから、プログラムは難しいって逃げられるんだよな。.NET FrameworkとCOMの相互運用なんて難しそうなこと実現してるのだから、これぐらい何とかしてよ(つд`) > MS

呼ばれる側のMSScriptControlはバイナリでいじれないので、呼ぶ側がObject[]&型で引数を用意して渡す必要があります。C#ではrefを前に付ければObject[]&型を渡せるLink ようですが・・・VB.NETでどうやるんだろ、これ?

調べてもVB.NETで実現方法がわからなかったので、C#で以下のようなMSScriptControlを扱うクラスを作って対処することになりました。う〜ん、[oneway]のためだけにC#が必要Link とか、凝った事するとなるとC#なんでしょうか・・・
using System;
using System.Collections.Generic;
using System.Text;

namespace MSScriptControlInterface
{
    public class ScriptControlInterface
    {
        protected MSScriptControl.ScriptControl mScriptControlInstance;

        public ScriptControlInterface()
        {
            //
            // TODO: Add constructor logic here
            //
            mScriptControlInstance = new MSScriptControl.ScriptControl();
            mScriptControlInstance.Language = "VBScript";
        }

        ~ ScriptControlInterface()
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(mScriptControlInstance);
        }

        public void AddCode(String code)
        {
            mScriptControlInstance.AddCode(code);
        }

        public object Run(string name, object[] arguments)
        {
            return mScriptControlInstance.Run(name, ref arguments);
        }
    }
}
VB.NETだけでやる方法もあります。
  1. AddCode()で定義する関数は
    • 引数を取らないようにする
    • 次のステップで渡すグローバル変数から引数を受け取る
  2. 渡したい値はAddObject()でグローバル変数として入れておく
  3. Eval()で関数を呼び、結果を受け取る (Eval("f()")など)
引数を取る関数を定義してEval("f(5,2)")のように式に引数を書き込めばAddObjectは不要ですが、変数やオブジェクトは渡せなくなります。

今週このネタ解決するだけで終わった orz

[参考]
  1. VB 6プログラマーのためのVB.NET入門 第11回 (@IT)Link
  2. Visual Studio .NET 2003 C#、Excel COM 操作Link
  3. C#からVBS経由でExcel操作Link
  4. COM オブジェクトの参照カウントを解放する (C#, VB.NET入門)Link

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

VBScriptで正規表現

blog20070913-VB6RefVBScriptRegExp

うわ、知らなかった。VBScriptで正規表現処理するVBScript.RegExpクラスなんてあったんだ。てっきり.NET Frameworkにしか無いと勘違いしてた。これ知ってれば、いくつかのVB6プログラムで仕様変更やあの手この手で代替処理しなくてもよかったのに orz

と恥をさらす記事でしたw

[参考]

— posted by mu at 11:18 am   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0158 sec.
prev
2007.9
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