質問するログイン新規登録

質問編集履歴

1

ベストアンサー後のまとめ

2019/02/20 02:36

投稿

kmyzr
kmyzr

スコア305

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,66 @@
1
+ ### ベストアンサー後のまとめ
2
+ **原因**
3
+ - コンソールとISEで最初に読み込まれているアセンブリが異なる
4
+ - `Using NameSpace` では アセンブリのロードは行われない
5
+ - スクリプトファイルが同じ場合`Add-Type`よりも`Class`等の定義が優先して読み込まれる
6
+ - `Class`等の定義時 利用されている 型 等が読み込まれていないとエラーになる
7
+
8
+ **対策**
9
+ - 最初に実行するスクリプトファイルで極力Add-Typeは済ませておく
10
+ - 最初に実行するスクリプトファイルは(コンソールだと)Add-Typeが必要な型などは使わない(使えない)
11
+
12
+
13
+ **コンソールだとロードされていないアセンブリの一括ロード**
14
+ 私の環境だと0.5~2秒ほどでそこまで時間はかからない
15
+ ```powershell
16
+ Using NameSpace System.IO
17
+
18
+ $asms = foreach ($asm in [System.AppDomain]::CurrentDomain.GetAssemblies()) {
19
+ $asm | ?{$asm.Location -ne $null} | Select-Object -Property @{N='Assembly';E={$asm.GetName().Name}}, Location -Unique
20
+ }
21
+
22
+ $asmsFile = "ISE_LoadAssemblies.csv"
23
+
24
+ if ($Host.Name -eq "Windows PowerShell ISE Host")
25
+ {
26
+ $asms | Export-Csv -Path ".$asmsFile" -NoTypeInformation
27
+ Write-host "Assembly write complete"
28
+ }
29
+ else
30
+ {
31
+ if (-not (Test-Path -Path ".$asmsFile"))
32
+ {
33
+ Write-Host "ISEで実行されたことがありません。"
34
+ return
35
+ }
36
+ $ISEAssembly = Import-Csv -Path ".$asmsFile"
37
+
38
+ $LoadedAssembly = $asms | foreach { $_.Location }
39
+
40
+ $Diff = $ISEAssembly | ?{ -not $LoadedAssembly.Contains($_.Location) }
41
+
42
+ $Error.Clear()
43
+ $Diff | ?{[Path]::GetExtension($_.Location) -eq ".dll"} | Foreach {
44
+ $Path = $_.Location
45
+ try
46
+ {
47
+ Add-Type -Path $Path -ErrorAction SilentlyContinue
48
+ }
49
+ catch
50
+ {
51
+ Write-Host "失敗 : アセンブリ名 = $($_.Assembly) パス = $Path" -ForegroundColor Red
52
+ }
53
+ }
54
+ if ($Error.count -ne 0)
55
+ {
56
+ Write-Host "失敗数 : $($Error.count)"
57
+ }
58
+
59
+ Write-host "Assembly loading completed"
60
+ }
61
+ ```
62
+
63
+
1
64
  ### 前提・実現したいこと
2
65
 
3
66
  PowerShell_iseで作成したスクリプト(ControlOperation.ps1)が