C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DLLの参照設定を確認する方法

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■88255 / inTopicNo.1)  DLLの参照設定を確認する方法
  
□投稿者/ タランティーノ (1回)-(2018/08/15(Wed) 14:32:18)

分類:[.NET 全般] 

VBで、DLLを参照設定している場合、
もしそのDLLがexeファイルと同じフォルダーにない場合
エラーとなってプログラムが落ちてしまいます。
予め必要なDLLが揃っているかどうか確認したいのですが
どのようなコードを書けば良いですか?




引用返信 編集キー/
■88256 / inTopicNo.2)  Re[1]: DLLの参照設定を確認する方法
□投稿者/ 774RR (624回)-(2018/08/15(Wed) 15:41:52)
Microsoft の提供しているシステム DLL (Windows に付属 DLL ) って話ではなくて、自作あるいはサードパーティ製品の DLL ってことであるとして。

普通は客先マシンに *あらかじめ* そういう自作・サードパーティ DLL が入っているってことはありえなくて、となると、それをコピーするのはインストーラの仕事。インストーラによって過不足なしに EXE/DLL とも当該ディレクトリに正しくコピーすればよいのでオイラはそういう「コードを書く」必要になったことはないっす。

というわけで質問の答えは「正しいインストーラ」である、に1票。

正しくインストーラを作っておけば旧バージョンからのアップグレードインストールとかそういうのまで全部勝手にやってくれるので、プログラム作成者が考えなきゃならないことが減るんだ。

こういう質問が出るということはインストーラなしってこと? それでは末端のお客様に手でファイルをコピーさせるってわけで、オイラ的にはありえない。この機会に是非インストーラを作ってほしい。
引用返信 編集キー/
■88257 / inTopicNo.3)  Re[1]: DLLの参照設定を確認する方法
□投稿者/ 魔界の仮面弁士 (1782回)-(2018/08/15(Wed) 16:06:16)
No88255 (タランティーノ さん) に返信
> もしそのDLLがexeファイルと同じフォルダーにない場合
グローバルアセンブリキャッシュに配置する方法もありますね。

開発環境の場合は、[参照の追加] ダイアログ ボックスへの追加のために
下記のエントリを利用できます。

https://support.microsoft.com/ja-jp/help/306149/

[HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\AssemblyFolders\タランティーノ]
@="C:\\Example\\タランティーノ\\"


> 予め必要なDLLが揃っているかどうか確認したいのですが
まずはアプリのインストーラーを見直すべきかと思いますが、
XCOPY 配置時に漏れが出た場合の調査などで必要ということでしょうか。


> どのようなコードを書けば良いですか?
試しに作ってみました。コマンドライン引数に EXE のフルパスを渡してみてください。

Imports System.Reflection
Public Module Module1
  Public Sub Main(args As String())
    Console.Clear()
    Console.BackgroundColor = ConsoleColor.Black
    Console.ForegroundColor = ConsoleColor.White
    For Each file As String In args
      Console.Write("ファイルパス:")
      Console.ForegroundColor = ConsoleColor.Green
      Console.WriteLine(file)
      Console.ForegroundColor = ConsoleColor.White
      Console.Write("アセンブリ名:")
      Try
        Dim asm = Assembly.LoadFile(file)
        Console.ForegroundColor = ConsoleColor.Cyan
        Console.WriteLine(asm.FullName)
        Console.ForegroundColor = ConsoleColor.White
        Dim ans = asm.GetReferencedAssemblies()
        Dim l = ans.Length.ToString()
        Dim ls = l.Length.ToString()
        For n = 0 To ans.Length - 1
          Console.Write("参照{0," & ls & "}/" & l & ":", n + 1)
          Dim an = ans(n)
          Console.ForegroundColor = ConsoleColor.DarkGreen
          Console.WriteLine(an.Name)
          Try
            Console.ForegroundColor = ConsoleColor.Yellow
            Dim a = Assembly.Load(an)
            Console.WriteLine(vbTab & a.Location)
          Catch ex As Exception
            Console.ForegroundColor = ConsoleColor.Magenta
            Console.WriteLine(vbTab & "参照不可")
          End Try
          Console.ForegroundColor = ConsoleColor.White
        Next
      Catch ex As Exception
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine("ロード失敗")
        Console.ForegroundColor = ConsoleColor.White
      End Try
      Console.WriteLine(StrDup(Console.BufferWidth - 1, "-"c))
    Next
    Console.ReadKey()
    Console.ResetColor()
  End Sub

End Module
引用返信 編集キー/
■88258 / inTopicNo.4)  Re[2]: DLLの参照設定を確認する方法
□投稿者/ 魔界の仮面弁士 (1783回)-(2018/08/15(Wed) 16:20:41)
No88257 (魔界の仮面弁士) に補足
>>どのようなコードを書けば良いですか?
> 試しに作ってみました。コマンドライン引数に EXE のフルパスを渡してみてください。

上記サンプルは、検証したい EXE と同じフォルダーに配置してください。
(もしくは、Assembly.LoadFile の直前に CurrentDirectory を変更するコードを書いておく)


> Try
>  Console.ForegroundColor = ConsoleColor.Yellow
>  Dim a = Assembly.Load(an)
>  Console.WriteLine(vbTab & a.Location)
> Catch ex As Exception
>  Console.ForegroundColor = ConsoleColor.Magenta
>  Console.WriteLine(vbTab & "参照不可")
> End Try

要するに、Assembly.GetReferencedAssemblies を列挙して Load の成否を見ているだけなので、
P/Invoke での依存アセンブリや DllImport/Declare される依存コンポーネント、
あるいは動的ロードされるようなアセンブリまでは判定できません。あしからず。
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ