ベストアンサー後
頂いたコードを参考に
書き直してみました。
既存のインテリセンスに追加 したかったのですが
TabExpansion
では方法が分からなかったため TabExpansion2
を書き換えました。
定義した全てのクラス(Enum)が見たいときは `['まで打って Ctrl + Space で見られます。
なぜか ISEのスクリプトウィンドウ内だと 表示されませんが
コンソールだと表示されます。
一先ずここで妥協します。
psm1 で保存し、ISEでの利用時には F8 等で 明示的に そのスクリプトを実行する必要があります。
powershell
1 文字数超過で載せられませんでした 2 下記記載の「インテリセンス 追加コード」へお願い致します。
途中経過 2019.03.06時点
一先ずpublicなクラスを継承して
NameSpace を利用する 手段は見つけました。
一度実行すればタイプ指定時のインテリセンスも使えました。
powershell
1Using Module .\class.psm1 2[System.Reflection.AssemblyName] $AssemblyName = "assemblyBuilder" 3 4$appDomain = [AppDomain]::CurrentDomain 5$assemblyBuilder = $appDomain.DefineDynamicAssembly( 6 $AssemblyName, 7 [System.Reflection.Emit.AssemblyBuilderAccess]::Run 8 ) 9$moduleBuilder = $assemblyBuilder.DefineDynamicModule($AssemblyName.Name) 10 11$TypeBuilder = $moduleBuilder.DefineType("kmkz.Form", [System.Reflection.TypeAttributes]::Public, [System.Windows.Forms.Form]) 12 13$TypeBuilder.CreateType() > $null 14 15$TypeBuilder.Assembly.GetTypes().NameSpace | sort -Unique | foreach { Write-Host "ネームスペース : $_" } 16Write-Host "フルネーム : $($Form.GetType().FullName)" 17 18$Form = [kmkz.Form]::new() 19$Form.ShowDialog() > $null 20
ですがメソッド等の追加の仕方も分からないですし...
自分で作ったクラスも継承できません
[System.Reflection.TypeAttributes]::Public, [System.Windows.Forms.Form])
の[System.Windows.Forms.Form]
を自分で定義したクラスにすると
"3" 個の引数を指定して "DefineType" を呼び出し中に例外が発生しました: "回収不可能アセンブリから回収可能アセンブリを参照することはできません。"
っとエラーになります.....
回収不可能アセンブリ も 回収可能アセンブリ も調べても何のことだか全くわかりません。
もし自作のクラスが継承できればそれで 一先ず目標は達成できるのですが...
そもそも ダイナミックモジュールじゃなくて普通のモジュールでは出来ないのでしょうか....?
前提・実現したいこと
ざっくりしたタイトルですみません。
叶えたいこと主には2つです。
0. クラス利用時 インテリセンスの利用が可能
- クラスのグループ分け(NameSpace?)
私がPowerShellで初めてクラスを触ったときの質問で 別のファイルにクラスを定義するとそのままだと インテリセンスを使うのは絶望的 だと思い
そこからずっと 定義したクラスを変数に格納して それを利用してきました。
そうすることでF8で実行してあげればインテリセンスが利用できるようになったからです。
そうしてずっと逃げてきたのです。
そんな中 とある質問でのZuishin様からの回答をきっかけに クラスの継承を 使うようになりました。
ですが、自分で定義したクラスをさらに継承(多重継承?)しようとした場合
今まで使っていた 変数に格納したクラスでは 継承が出来ず 再びインテリセンスが使えない状態に陥ってしまいました。
「どうせインテリセンスが使えないのなら全て諦めてしまおうと」そう思ったのですが、
Formに関する質問をしたときにimihito様に頂いたコードの中でモジュールなるものが使われていて 見よう見まねで書き変えて実行したとき 何かの要因でたまたま上手く実行できず 追加の質問をしたのですが その中で Imihito様が
「PowerShell v5はあまり使ったことがありませんが、using module モジュール名
でモジュール内のクラスのインテリセンスは効きそうですね」
っと云っていたのを思い出しました。
その時「試してみます」っと自分で云っていたのですが試してなかったので試してみました。
powershell
1<# 2 ファイル名 : Class.psm1 3 の内容 4#> 5Class te2st 6{ 7 PutText() 8 { 9 Write-host "methodが実行されました。" 10 } 11}
powershell
1<# 2 ファイル名 : Class.ps1 3 の内容 4#> 5Using Module .\Class.psm1 6# Import-Module -Name .\Class.psm1 <Using Module だけで動作したため不要> 7 8$test = [te2st]::new()
結果は良好 staticメンバ も instanceメンバ もしっかりインテリセンスが使えました。
これで殆ど 目的は達成できているのですが [te2st]
の入力時にインテリセンスが使えないので
使えるようにしたいのと
Enumの例なのではclassでは可能か分からない、
一度実行しないとインテリセンスが使えない、
C#をAdd-Typeで読み込むのと一緒で ISEだと 一度読み込んでしまうと 書き換えても再起動しないと 更新できないのが難点ですが
このサイトで[MyClass.te2st]
のMyClassのように自分でNameSpace? を作ることが不可能ではない っということを知ってしまったので
クラスのグループ分けが出来れば[MyClass.
まで打ってインテリセンスを見たりすれば自分で定義したクラスが一目瞭然で
しかも、もしも内容が異なる同じ名前のクラスを同時に使いたくなってもNameSpace? で分けてあれば悩む必要もなくなるだろう
っということで[MyClass.te2st]
のようにグループ分けが出来るようにしたいです。
自分でネットなどでいろいろ情報を集めているのですが、このままだと
いつになったら出来るのか、そもそも出来るのかすら怪しいです。
代替策、そもそも論 等でも助かります。
宜しくお願い致します。
発生している問題
前提 : クラスは再利用が前提なので別ファイルになることは避けられなさそう
-
クラスのインテリセンスが使えない (Type指定時)
(ファイル名とクラス名が違ったり 一つのファイルに複数のクラスが定義されていると
そのファイルを開いてクラス名を確認しないといけない)
補足情報(FW/ツールのバージョンなど)
Win10
powerShell_ISE Ver V5
どのパソコンで作業、実行 するのか決まっていないのと
毎回全てのクラスを使うわけではない(一つのプロジェクトのみでしか利用しないのもある)ので
プロファイル等 設定済みPCでしか利用できない方法は使えません。

回答1件
あなたの回答
tips
プレビュー