.NET(VB) いまさらだけどVBでYieldを書いてみた

C#ではVisualStudio2005(C#2.0)でyieldが登場し、
VBではVisualStudio2012(VB11)でやっとyieldが使えるようになりました。

「いつか使ってみたいなぁ」と思っていたけれど、まったく使う機会がありませんでした。
もうね「このまま一生使うこともないのかなぁ」と思ってました。
しかし、この度やっとyieldを使ってみることができました!しかもVBで!

うれしかったですね。
「yield便利~♪」より「yieldやっと使えたよ~っ泣」って。

yield便利だけど使う機会がほぼないんですよね。
特に私のような末端の底辺PGにはw
しかもジェネリックの登場で自作コレクションを作る機会自体が減ってますからね。

今回はASP.NETで自作コレクションクラスを作る必要がありyieldを使ってみました。
(少しハマった部分もありました。別記事で書きます。)

yieldの使い方はネットにごろごろあるので自分用のメモ程度に記載しておきます。

VisualStuidio2013/Fw4.0/VB
Public Class MyCollection
    Implements IEnumerable(Of String)

    Private _items As New List(Of String)

    Public Iterator Function GetEnumerator() As IEnumerator(Of String) _
    Implements IEnumerable(Of String).GetEnumerator
        For Each s As String In Me._items
            Yield s
        Next
    End Function

    Public Function GetEnumerator1() As IEnumerator _
    Implements IEnumerable.GetEnumerator
        Return GetEnumerator()
    End Function
End Class

自作コレクションクラスをForEachでクルクルまわせたり、Linqで使えるようにするためにIEnumerable(Of T)を実装させます。
IEnumerable(Of T)を実装すると、GetEnumerator()メソッドとGetEnumerator1()メソッドを実装する必要があります。

GetEnumerator1()メソッドは、もう一方のGetEnumerator()を返すように実装します。
GetEnumerator()メソッドは、Yeildを使用できるようにIteratorキーワードを付けます。
Public Iterator Function GetEnumerator() As IEnumerator(Of …
あとはコレクションの要素をクルクル回して1コづつYeildで返してあげればOKです。

.NET VisualStudioのバージョンとFrameWork、VB、C#の対応表

調べる必要があったのでメモっておきます。

Visual StudioFrameworkVBC#
Visual Studio 2015Framework 4.6 VB14C#6.0
Visual Studio 2013Framework 4.5.1VB12C#5.0
Visual Studio 2012Framework 4.5 VB11C#4.5
Visual Studio 2010Framework 4.0 VB10C#4.0
Visual Studio 2008Framework 3.5 VB9 C#3.0
Visual Studio 2005Framework 2.0 VB8 C#2.0
Visual Studio 2003Framework 1.1VB7.1 C#1.1
Visual Studio 2002Framework 1.0 VB7 C#1.0

Oracle Oracleクライアントのアンインストール

Oracleクライアントのアンインストール方法です。

複数VersionのOracleクライアントをインストールしている開発用PC(Windows8)で、
Oracleクライアントをアンインストールして、再度Oracleクライアントをインストールしたところ
.Netで作成したWindowsフォームアプリで32bitでコンパイルしたものが動作しなくなってしまいました。
同じく.Netで作成した別のWindowsフォームアプリで64bitでコンパイルしたものは動作しました。

使用しているOracle.DataAccess.dllが参照できなくなってしまったようです。

ODP.NETのdll(OracleDataAccess.dll)は、
GACにインストールされている「発行者ポリシー」の仕様により、
アプリケーション開発者が意図しないバージョンのODP.NETが、アプリケーションの実行時に使用されてしまうという問題があります。
詳しくはコチラ「熱燗ロックのブログ ODP.NETのバージョン問題

Oracleクライアントのアンインストールで、GACに登録されているOracleの発行者ポリーシーが削除されなかった為に
32ビット用のODP.NETを使用したときに、削除されなかった発行者ポリシーが、アンインストールされたODP.NETを使用するようにリダイレクトさせているようです。

そこで複数バージョンのOracleクライアントをインストールした際のアンインストール手順をメモっておきます。

アンインストール手順


Oracleクライントのアンインストール


「すべてのプログラム」 ⇒ 「Oracle - 各オラクルクライアントのバージョン」 ⇒ 「Oracle Installation Produucts」 より
「Universion Installer」を起動します。
開いたダイアログの「製品のアンインストール」ボタンをクリック

削除する製品をチェックして「削除」ボタンをクリック

すると「deinstall.bat」を実行しろと警告メッセージが表示されます。
指示されたバッチファイルを実行します。
(…各Oracleクライアントのdeinstall.batを実行すれば、ここまでの手順は不要だと思います。

バッチを実行すると、結構長い間「Checking for reuiured …略…」と表示されたままですが、しばらくするとアンインストールが始まります。


バッチがおわったら、残った残骸を削除していきます。

ファイルの削除


  • C:\Program Files\Oracle
  • C:\Program Files (x86)\Oracle
  • 各オラクルクライアントをインストールしたフォルダ
  • (インストールフォルダがわからない場合は、後述のレジストリエディタ「HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE」で確認できます。)

スタートメニュー


「すべてのプログラム」でスタートメニューを起動し「Oracle - 各オラクルクライアントのバージョン」を削除

環境変数


「コントロールパネル」 ⇒ 「システム」⇒ 「システムの詳細設定」で「システムのプロパティ画面」を起動し、
「環境変数」ボタンをクリックし、「Path」からOracleを含む変数を削除します。

レジストリ


※削除する前にバックアップを取ってくださいね。
削除するキーは
Oracle10gの情報ですがOracle Database インストレーション・ガイド Oracle Databaseソフトウェアの削除の中ほどに 「Microsoftレジストリ エディタからのOracleキーの削除」に記載されているものを削除しました。

「ファイル名を指定して実行」より「regedit」と入力し「レジストリエディタ」を起動します。
■HKEY_CLASSES_ROOT
Ora、Oracle、OrclまたはEnumOraで始まるキーを削除。
以下のものがあります。
  • EnumOraHomes
  • OracleConfig
  • OracleDatabase
  • OracleHome
  • OracleInProcServer
  • OracleProcess
  • ORADC
  • ORAMMCCFG10
  • ORAMMCPMON10
  • OraOLEDB
  • OraPerfMon
  • ORCLMMC
  • ORCLSSO

■HKEY_CURRENT_USER
ORACLEキーを削除。

■HKEY_CURRENT_USER\Software
Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programsの下にあるOracle-HOME_NAMEエントリなど、すべてのOracleキーを削除。

■HKEY_LOCAL_MACHINE\SOFTWARE
ORACLE Groupキーを削除。
※ここに記載されている内容ががOracle Universal Installerの場所です。

■HKEY_LOCAL_MACHINE\SOFTWARE\ODBC
ODBCの下にあるサブキーをすべて展開して、Microsoft ODBC for Oracleキーを除くOracle関連のODBCドライバ・キーをすべて削除。

■HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
この下のOracleまたはOraWebで始まるすべてのキーを削除。

■HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
この下のOracleで始まるすべてのキーを削除。

GACの削除


C:\Windows\Microsoft.NET\assembl\GAC_32
C:\Windows\Microsoft.NET\assembl\GAC_64
C:\Windows\Microsoft.NET\assembl\GAC_MSIL
C:\Windows\assembly
上記のフォルダからOracleとつくファイルを削除していきます。
以下のようなものがあります。
  • Oracle.DatatAccess
  • Oracle.DataAccess.resources
  • Oracle.Web
  • Oracle.Web.resources
  • Policy.XXXXX.Oracle.DataAccess
  • Policy.XXXXX.Oracle.Web
上記のファイルは削除しようとすると「アクセス権限がありません。」となります。
VisualStudio付属ツールのコマンドプロンプトを使用して削除します。(GACからアセンブリを登録解除する)

VisualStudio2013の場合
「スタートプログラム」 ⇒ 「Microsoft Visual Studio 2013」⇒ 「Visual Studio ツール」をクリックし「開発者コマンド プロンプト for VS2013」を右クリック「管理者として実行」

VisualStudio2010の場合
「スタートプログラム」 ⇒ 「Microsoft Visual Studio 2010」⇒ 「Visual Studio ツール」⇒「Visual Studio コマンド プロンプト (2010)」を右クリックし「管理者として実行」


GACからアセンブリを登録解除するコマンドを入力します。
gacutil /u "削除するアセンブリ名,Version=X.XXX.X.X, Culture=XXXXX, PublicKeyToken=XXXXXXXXXXX"
アセンブリの情報はファイルエクスプローラより削除したいアセンブリを右クリックし「プロパティ」で確認できます。

たとえばOracle.DataAccessを削除する場合
gacutil /u "Oracle.DataAccess,Version=2.121.1.0, Culture=Neutral, PublicKeyToken=89b483f429c47342"

以上で削除は終了です。

忘れずにPCを再起動します。

Oracleクライアントを再インストールして、.Netで作成したWindowsフォームアプリ(32bit、64bit)ともに正常に動作しました。