VB のたまご

作成日: 2015/12/20, 更新日: 2015/12/20


exe ファイルとは違う階層に、dll ファイルを配置して読み込みたい(参照設定)

プログラムは、同じ場所に置かないとエラーになる

  •  小さいプログラムだと、exe ファイル1個で済むのでいいのですが、 大きいプログラムになると、複数の exe ファイルや 参照する dll ファイル、関連データ、設定データ等、いろいろなファイルが増えてきます。 ユーザーさんにとって、どれを起動すればいいの?と思われないように、起動用の exe ファイル以外は、フォルダにまとめて整理整頓したくなります。

  • スポンサーリンク


  •  関連データや設定データは、パスが変わったらパスの指定を変えれば読み込めるので、何とかなります。 しかし、参照プログラムはそう簡単にできませんでした。
  • アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。
    [続行] をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。
    [終了] をクリックすると、アプリケーションは直ちに終了します。
    
    ファイルまたはアセンブリ 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 、またはその依存関係の1つが読み込めませんでした。
    指定されたファイルが見つかりません。
    

  •  起動しようとすると、このようなエラーメッセージが表示されます。仲良すぎー!
  • このエラーは、以下のサンプルで出しています。 WindowsApplication に、ClassLibrary1 のプロジェクトを追加して、ClassLibrary1 に、以下のようなソースを書きます。
  • Public Class Class1
    
        Public Sub ShowMessage(msg As String)
            Console.WriteLine(msg)
        End Sub
    
    End Class
    

  •  WindowsApplication では、参照設定に ClassLibrary1 を追加して、以下のようなソースを書きます。
  • Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim c1 As New ClassLibrary1.Class1
            c1.ShowMessage("hello")
    
        End Sub
    
    End Class
    

  •  後はビルドすれば出来上がりです。


スポンサーリンク


コンフィグファイルに、探す場所を追加しよう

  •  MSDN を見ると、コンフィグファイルに指示を書けばいいとのことです。ソースやプロジェクトの設定を変えるのではないんですね。 で、コードベース要素かプローブ要素を書けばいいじゃん。とのことでした。今回の、私の目的に合う簡単な方法は、プローブ要素を書けばいいみたいです。 それだけでできるのであれば、以外に簡単ですね。

  •  んじゃ、やってみよう。 exe ファイルと同じ場所に、xxx.exe.config というコンフィグファイルが一緒にくっついているので、これを編集します。 どうせなので、Visual Studio に、ぽいっと放り込んで書き換えます。


  •  初期設定はこうなっています。
  • <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
    </configuration>
    

  •  これに、以下のように追加します。
  • <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
    
        <!-- ここから -->
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <probing privatePath="app" />
            </assemblyBinding>
        </runtime>
      <!-- ここまで -->
      
    </configuration>
    

  •  書き換えたら保存して閉じます。 そして、exe ファイルがある場所に、app フォルダを作成して、この中に、ClassLibrary1.dll をぽいっと入れます。 そして、exe ファイルを実行してみると、なんとエラーが出ません。メッセージも出ません(コンソール出力するように書いているからね)。

  • <probing privatePath="app;app2;app3\subapp" />
    
  •  また、このように書くことで、複数のフォルダを指定することができます。プログラム別にまとめることができますね。 今回はかなり簡単にできました。プログラムも変更がありません。ぜひ、やってみてください!

  •  最後までこの記事を読んでいただき、ありがとうございました。


スポンサーリンク