タイトル : Re^5: DLL内の複数クラスで値を参照/格納する方法は? 投稿日 : 2005/08/30(Tue) 19:08 投稿者 : なおこ(・∀・)
お世話になります。 > > ・classは静的クラスではないですよね? > DLLをインポートしてるわけではないので動的クラスだと思っています。 > アプリケーションと同じ場所にDLLを配置しています。 おお,書き方がまずかったでした。 これはSharedメンバやメソッドをもつクラスですか? という意味できいていました。 > 少しソースが長くなってしまいますが、いいでしょうか? > (これでも短くした方なんですが・・・) ありがとうございます。 んで,見たのですが, 呼び出し元アプリで, Dim ObjLog As New ClsOutLogとやっていて, クラスAでも Catchブロックで Dim ObjLog As New ClsOutLogとやっているので, 呼び出し元アプリに制御が戻ってきた時に, クラスAで設定した値が反映されないのは,当然といえば当然です。 呼び出し元アプリと,クラスAのCatchブロックでのObjLogは 変数名や型は同じでも全く別物ですよね。 > Public変数宣言を「Public Shared」に変更したら取得する事ができ > ました。 Public変数はあんまりよろしくないですよ,と言う事はおいときまして, Sharedにしたらウマい事いったのは, Sharedにすると,Sharedという言葉の通り,変数宣言をどこでやろうと 値が共通で保持されます。 なので,思う値がとれたわけですね。 共通部品として使うのであれば,Sheredの方法はマズイっす。 なので,現状のClsOutLogのままやりたいんであれば, ClsFileMove.FMove等のメソッドに引数として, ClsOutLogのインスタンスを渡す方法があります。 # でも,あんまりスマートじゃないですよね。 例外クラス化する例として,コードをちょっと修正してみました。 # Catch ObjLog As ClsOutLogExcepionにブレークポイントを張って,ObjLogを見てみてください。 # これが正しいですよ。という意味ではないですので,参考程度にしてくださいね。 Class Test Shared Sub Main() Try Dim ObjFileMove As New ClsFileMove ObjFileMove.FMove("移動前ファイル", "移動後ファイル") Catch ObjLog As ClsOutLogExcepion ObjLog.WriteLog("ログファイル", "メッセージファイル") Catch ex As Exception Trace.WriteLine(ex.StackTrace) End Try End Sub End Class Public Class ClsFileMove 'ファイル移動メソッド Public Sub FMove(ByVal StrMoveBefore As String, _ ByVal StrMoveAfter As String) Try System.IO.File.Move(StrMoveBefore, StrMoveAfter) Catch Ex As Exception Dim ObjLog As New ClsOutLogExcepion ObjLog.PropertyTest = Err.Number Throw ObjLog End Try End Sub End Class Public Class ClsOutLogExcepion Inherits Exception Private PubIntErrNo As Integer 'Err.Number設定/取得用プロパティ Public Property PropertyTest() As Integer Get Return PubIntErrNo End Get Set(ByVal IntNumber As Integer) PubIntErrNo = IntNumber End Set End Property 'ログ出力メソッド Public Function WriteLog(ByVal strLogFile As String, _ ByVal strMsgFile As String) As String '様々な処理を行う Dim StrEC As String 'クラスAでセットされた"Err.Number"を取得(したい) If PropertyTest <> 0 Then StrEC = "(Code=" & CStr(PubIntErrNo) & ")" Else StrEC = "" End If 'ログ出力実行 End Function End Class #以下蛇足。 Errオブジェクトでエラーの内容を判断するより, 折角Try〜Catchしてるのですから, Catchした例外の種類でどんなエラーか判別するのがいいと思いますよ。 例えば,System.IO.File.Moveなんかだと, DirectoryNotFoundException…これはディレクトリが無い時等に投げられる。 FileNotFoundException…移動元のファイルが無い時に投げられる。 …他,いろいろ |