DOBON.NETプログラミング道掲示板
(現在 過去ログ4 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34755 / inTopicNo.1)  dll修正時、それを参照しているexeのリビルド要否
  
□投稿者/ 沢庵 一般人(1回)-(2021/06/02(Wed) 21:21:28)
  • アイコン環境/言語:[VB2017] 
    分類:[.NET] 

    現在、以下の2つのプロジェクトを含む
    ソリューションMySol1.slnがあります。
    
    ■MyLibプロジェクト(DLL)
    Public Class MyXxxx
        Enum XxxxEnum
            Xxxx1
            Xxxx2
        End Enum
        Sub New(ByVal xxx As ExxxEnum)
            '省略
        End Sub
        Sub Calc()
            Select Case yyy
            Case XxxxEnum.Xxxx1
                '省略
            Case XxxxEnum.Xxxx1\2
                '省略
            End Select
        End Sub
    End Class
    ■MyApp1プロジェクト(EXE) ※MyLib.dllを参照。
    Public Class Main
        Private Sub MySub1()
            Dim xxx = New MyLib.MyXxxx(MyLib.MyXxxx.XxxxEnum.Xxxx2)
        End Sub
    End Class
    
    ビルドし、同一フォルダに
    MyLib.dll
    MyApp1.exe
    を格納して、使用しています。
    
    今回、別件でMyLibプロジェクトを修正しました。
    MyLibプロジェクトは他のソリューションでも使用しています。
    
    ■MyLibプロジェクト(DLL)
    Public Class MyXxxx
        Enum XxxxEnum
            Xxxx1
            Xxxx2
            Xxxx3     'Enumに1つメンバを追加。
        End Enum
        Sub New(ByVal xxx As ExxxEnum)
            '省略
        End Sub
        Sub Calc()
            Select Case yyy
            Case XxxxEnum.Xxxx1
                '省略
            Case XxxxEnum.Xxxx2
                '省略
            Case XxxxEnum.Xxxx3     'Case分岐追加。
                '省略
            End Select
        End Sub
    End Class
    
    この場合、フォルダに格納するモジュールは
    MyLib.dllだけの差し替えで問題ありませんでしょうか?
    
    フォルダに格納されるファイルは
    下記のような状態でも、MyApp1.exeは問題ないでしょうか?
    
    MyLib.dll    '修正版でビルドしたファイルで差し替え
    MyApp1.exe   '古いMyLibでビルドしたファイルのまま
    
    プロパティを削除したり、メソッドを削除したり、
    
    メソッドの引数を変更した場合は、参照しているexeをリビルドしないといけない
    とは思うのですが、
    Enumのメンバーを追加した時に、リビルドが必要かどうかを教えてください。
    
    

引用返信 削除キー/
■34756 / inTopicNo.2)  Re[1]: dll修正時、それを参照しているexeのリビルド要否
□投稿者/ 魔界の仮面弁士 大御所(1344回)-(2021/06/02(Wed) 22:18:26)
  • アイコン2021/06/02(Wed) 22:50:19 編集(投稿者)

    No34755に返信(沢庵さんの記事)
    > MyLibプロジェクトは他のソリューションでも使用しています。
    > この場合、フォルダに格納するモジュールは
    > MyLib.dllだけの差し替えで問題ありませんでしょうか?

    Enum が Private であれば問題ありませんが、
    Public だとしたら、「他のソリューション」の実装次第だと思います。
    要件次第では、問題になることがあるでしょう。

    すなわち『値の網羅性』をどう扱うべきであるのか…ということです。


    追加した値そのものは、呼び出す側(EXE)をリビルドせずとも、
    DLL を入れ替えた時点ですぐに使えるようになります。

    Enum.GetValues / GetNames で得た配列情報を ComboBox に表示したり
    ToDictionary 拡張メソッドに渡していた場合も、リビルドせずに
    ただちに新しい値が反映されます。

    後はその新値が何を意味するのかが重要になるというわけですね。


    たとえばリビルドせずに新値が渡された場合、相手が C# で
    switch 式 (≠switch ステートメント)に使われていたとしたら、
    網羅性チェックにより、新値に対するスイッチが存在しないために
    SwitchExpressionException (.NET Core 3.x / .NET 5 / .NET 6)
    InvalidOperationException (.NET Framework) の例外になってしまいます。
    https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/switch-expression

    ※リビルドすれば、コンパイル警告 CS8509 によって新値への対応漏れを検出できます。


    VB には列挙値に対する網羅式が実装されていませんが、
    それでも Select Case や If で受けている場合には、
    当初想定されていない列挙値に対する取り扱いが肝になる点は変わりません。

    ・想定外なら無視する
     (一番単純だが、仕様変化時に対処漏れが発生しやすい。)

    ・想定外なら例外にする
     (実装漏れを防ぐという意味では、ある意味安全ではある)

    ・想定外なら既定値扱いにする
     (実行時エラーを防ぐための措置。良し悪しはケースバイケース。)


    さらに Flags 属性付の列挙型の場合は、マスク判定に影響が出るケースもあるでしょう。


    あるいは Enum.TryParse メソッドや IsDefined メソッドによるガード句についても考慮が必要です。
    たとえば System.Environment.GetFolderPath(SpecialFolder) メソッドには

     If Not System.Enum.IsDefined(GetType(SpecialFolder), 引数) Then
      Throw New ArgumentException(…)
     End If

    に相当するガード句があるため、列挙値が増えれば意味合いも変化します。
    (従来は例外になっていた値が、列挙値に加わったことで通過してしまうわけで)
引用返信 削除キー/
■34759 / inTopicNo.3)  Re[2]: dll修正時、それを参照しているexeのリビルド要否
□投稿者/ 沢庵 一般人(2回)-(2021/06/07(Mon) 20:33:30)
  • アイコンリビルドせずに、DLLファイルだけ差し替えて、EXEを動作確認して、
    エラーが発生しないようであれば、
    そのままDLLだけ差し替えようと思います。

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

解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -