dポイントプレゼントキャンペーン実施中!

お世話になります。 どうぞよろしくお願い致します。

powershell ISEで下記コードの関数名を変更すると

"Add-Type : 型を追加できません。型名 'sample' は既に存在しています。…"

という警告が発生します。 ただし、ISEを再起動すると問題なくコンパイルされます。


なぜでしょうか? どうぞよろしくお願い致します。




 PS1 VC#内でスクリプトとして利用すると同じ問題が発生します。 同じく再起動すると解決します…
PS2 検索してみると同じように悩みを持たれている方がいらっしゃるようですが
解決していないようです。

ttp://www.vistax64.com/powershell/224562-v2-ctp3-there-way-undo-action-add-type.html
ttp://mtgpowershell.blogspot.com/2010_06_01_archive.html



下記コードで、

a() → aa()

等に関数名を変更してみてください。

$source=@"
public class sample{

public static int a()
{
int b=2;
return b;
}
}
"@

Add-Type -TypeDefinition $source

$e= [sample]::a()

$e

A 回答 (4件)

多分、F5実行の度にPowerShellが完全終了→再起動みたいなイメージをお持ちなんではないでしょうか


スクリプト言語をエディタからの自動実行とかさせたらそんなイメージですよね

次の3行をスクリプトペインに貼っつけて、まず走らせて下さい

$n = 0
$n++
Write-Host $n

1が表示されたと思います。
次に1行目の「$n = 0」をコメントアウトしてから2回、3回とF5を押してください
増えてってますよね?
つまり、F5押したときには前の続きで走っているようなイメージなんじゃないでしょうか
「シェル」ですから、これはこれで普通な気もします。

関数名を変更したら・・・と仰られていましたが、例えばint bの値を書き換えただけでも関数名変更時と同様のエラーが出ると思いますよ。

他に方法あるかもしれませんが、自分はISE終了させる他に初期環境から始める方法を知りません。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

丁寧なご説明ありがとうございます。
おかげさまでようやく理解できてきました…

で、つたないながらも一度終了させるために、アプリケーションドメインの
終了…と下記を組んでみましたが、$nは増えていくばかりで
終了していないようです…

ご返答ありがとうございました。

$appDomain=[AppDomain]::CreateDomain("test1")

$n++
Write-Host $n

$appDomain

[AppDomain]::Unload($appDomain)

$appDomain

お礼日時:2011/05/10 09:05

「F5 を押す」たびに「スクリプトを実行する」んでしょ?



だったら, 「エラーになる」のが当然であって, これで「なぜ?」と思う方がおかしい.
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

すいません。 どうもよくわかっていません。

いろいろ考えてみましたが、下記コードでもダメでした…

アプリケーションドメインのFriendlyNameのID?が変わっているからでしょうか?

どこか違う場所があれば、添削ください…


$appDomain=[AppDomain]::CreateDomain("test1")

$source=@"
public class sample{

public static int a()
{
int b=2;
return b;
}
}
"@

Add-Type -TypeDefinition $source

$e= [sample]::a()

$e

[AppDomain]::Unload($appDomain)

お礼日時:2011/05/09 23:53

ISEで書き換えるたびにF5押しているイメージですよね?


多分、次のサイトが参考になります。

http://flamework.net/archives/8

ここの情報にあるとおり

[AppDomain]::CurrentDomain.GetAssemblies()

をコードの最後に入れとくと、F5結果表示する時の末尾に「False v2.0.50727 」みたいなのがどんどん増えていくと思います。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

リンク先を読ませて頂いたのですが、リンク先のサンプルが難しく四苦八苦してます。
(まだまだ理解が足らないのだと思います)
(MSNのアプリケーションドメインの説明を読んだり、メモリリークのないサンプルと見比べているのですが…)

もし、上のサンプルに何行か追加すれば解決であれば、お教え頂けないでしょうか?
ちょっと今のレベルでは、解決できそうにないです…

本当に申し訳ないです。

お礼日時:2011/05/09 22:56

まさか「クラス sample を 2回定義しようとしている」などという愚かなことはしていませんよね?

    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

NO.2さまの通りで、ISEで書き換えるたびにF5押しているイメージです。

ですので、F5を連続して押すというのが、sampleを2回定義しているに
あたりますでしょうか?

お礼日時:2011/05/09 22:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!